Может ли функция Голанга вернуть интерфейс {} {} - как вернуть список карт - PullRequest
0 голосов
/ 25 апреля 2018
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 голосов
/ 25 апреля 2018

Код 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
}
0 голосов
/ 25 апреля 2018

Создать тип возврата в 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{}.Для получения значения необходимо набрать 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"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...