能否在Golang函数中返回interface{}类型?- 如何返回一个map列表

6
func getLatestTxs() map[string]interface{}{} {
    fmt.Println("hello")
    resp, err := http.Get("http://api.etherscan.io/api?module=account&action=txlist&address=0x266ac31358d773af8278f625c4d4a35648953341&startblock=0&endblock=99999999&sort=asc&apikey=5UUVIZV5581ENPXKYWAUDGQTHI956A56MU")
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Errorf("etherscan访问失败")
    }
    ret := map[string]interface{}{}
    json.Unmarshal(body, &ret)
    if ret["status"] == 1 {
        return ret["result"]
    }
}

我希望在我的代码中返回 map[string]interface{}{}

但是我得到了编译错误:syntax error: unexpected [ after top level declaration

如果我将map[string]interface{}{}更改为interface{},则不再有编译错误。

注意:我使用map[string]interface{}{}是因为我想返回一个映射列表。


对于一个映射列表,请在前面使用[]。例如,[]map[string]interface{} - mkopriva
@mkopriva 如果我们使用[]map[string]interface{},将会抛出一个错误。因为ret["result"]是一个interface{} - Himanshu
2个回答

8

代码 map[string]interface{}{} 是一个空映射的组合字面值。函数是通过类型声明而不是值声明的。看起来您想返回切片类型[]map[string]interface{}。请使用以下函数:

func getLatestTxs() []map[string]interface{} {
    fmt.Println("hello")
    resp, err := http.Get("http://api.etherscan.io/api?module=account&action=txlist&address=0x266ac31358d773af8278f625c4d4a35648953341&startblock=0&endblock=99999999&sort=asc&apikey=5UUVIZV5581ENPXKYWAUDGQTHI956A56MU")
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Errorf("etherscan访问失败")
    }
    var ret struct {
        Status  string
        Result  []map[string]interface{}
    }
    json.Unmarshal(body, &ret)
    if ret.Status == "1" {
        return ret.Result
    }
    return nil
}

我想返回一个映射列表,ret["result"],看起来你返回了一个映射,是吗? - 眭文峰

1
创建返回类型为map[string]interface{}。因为从GET请求返回的响应是map[string]interface{}类型,而不是复合字面量map[string]interface{}{}。所以你可以像这样使用它。
func getLatestTxs() map[string]interface{} {
    fmt.Println("hello")
    // function body code ....
    return ret
}

对于这行代码

如果我将map[string]interface{}{}更改为interface{},就不会再出现编译错误。

我们可以将任何东西转换为interface{},因为它作为一个包装器可以包装任何类型并保存底层类型及其值。该值可以使用底层类型的类型断言来接收。因此,在您的情况下,当您使用接口时,它将包装map[string]interface{}值。要获取该值,需要进行类型断言,如下所示。

func getLatestTxs() interface{} {
    fmt.Println("hello")
    // function code .....
    //fmt.Println(ret["result"])
    return ret
}


ret["result"].(interface{}).([]interface{})

打印底层的map[string]interface{},以获取结果中单个对象的值。
fmt.Println(ret["result"].(interface{}).([]interface{})[0].(map[string]interface{})["from"])

1
在您的情况下,ret["result"] 实际上是一个 interface{} 而不是 map[string]interface{},其内部值是 []interface{} 接口切片。因此,请使用以下代码:fmt.Println(ret["result"].(interface{}).([]interface{})) - Himanshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接