Возвращение значений, созданных внутри функции в Go, вполне нормально и обычно используется.Компилятор использует escape-анализ, и если он не может доказать, что значение не выходит из функции, оно будет размещено в куче, и поэтому не будет уничтожено, когда функция вернется, и может быть использовано после того, как функция вернулась.
Ошибка не может быть вызвана линией, печатающей карту (если только она не содержит рекурсивную структуру данных, чего не происходит, поскольку она является результатом демаршалинга JSON).Печать пустых или даже nil
карт возможна и не приводит к ошибке.
Скорее всего, ошибка в вашей функции twitterRequest()
, возможно, когда вы делаете утверждение типа, возвращающее значение:
return jsonResp.(map[string]interface{})
Это утверждение типа приводит к панике во время выполнения, если jsonResp
равно nil
или значение, которое оно содержит, не относится к типу map[string]interface{}
.Это может быть nil
, если тело ответа является недействительным JSON, и это может быть значение другого типа, если тело ответа является допустимым JSON, но это, например, массив JSON.
Сначала проверьте всеошибки, в том числе при чтении тела:
respBody, _ := ioutil.ReadAll(resp.Body)
Сделайте это следующим образом:
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
// Handle error, optionally return
}
Вам также следует использовать специальную форму утверждения типа:
m, ok := jsonResp.(map[string]interface{})
if !ok {
// jsonResp is nil or is not a map!
// Handle this error case and return
}
return m // all ok
Эта специальная форма утверждения типа никогда не будет паниковать, вместо этого, если утверждение не выполняется, переменная ok
будет иметь значение false
, что вы можете проверить и обработать правильно.Если ok
равно true
, это означает, что jsonResp
не было nil
, и значение внутри него действительно было значением типа map[string]interface{}
, которое хранится в m
, которое вы можете безопасно вернуть.