Может ли функция Голанга вернуть интерфейс {}{} - как вернуть список карт
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 ответа
Код 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
}
Создать тип возврата для 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"])