可以golang函数返回接口{} {} - 如何返回地图列表

时间:2018-04-25 04:29:25

标签: go interface go-map

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{}{}因为我想要返回地图列表。

2 个答案:

答案 0 :(得分:3)

代码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
}

答案 1 :(得分: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{},因为它可以作为包装器,可以包装任何类型,并保存基础类型及其值。可以使用基础类型的类型断言来接收该值。因此,在您使用接口的情况下,它将包含map[string]interface{}值。要获取值,需要键入assert,如下所示。

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"])