Go map возвращает нулевое значение, даже если значение присутствует - PullRequest
0 голосов
/ 03 октября 2018

Предположим, answers ниже - это map[string]interface{}, не распакованный из строки JSON.

if baths, ok := answers["bathrooms"]; ok {
  bathsFloat := baths.(float64)
}

Каким-то образом я испытываю панику с interface conversion: interface {} is nil, not float64.Как это возможно, если проверка присутствия выполняется?

1 Ответ

0 голосов
/ 03 октября 2018

ok только сообщает, находится ли ключ на карте, является ли значение, связанное с ним, nil (или вообще нулевым значением типа значения) или нет, это другое.

См. Этот пример:

answers := map[string]interface{}{
    "isnil":  nil,
    "notnil": 1.15,
}

if v, ok := answers["isnil"]; ok {
    fmt.Printf("Value: %v, type: %T\n", v, v)
}
if v, ok := answers["notnil"]; ok {
    fmt.Printf("Value: %v, type: %T\n", v, v)
}

Вывод (попробуйте на Go Playground ):

Value: <nil>, type: <nil>
Value: 1.15, type: float64

Если answers является результатом немаршалинга JSON, тогда значение, связанное с ключом в нем, будет nil, если значение в источнике - JSON null.

См. этот пример:

var m map[string]interface{}

err := json.Unmarshal([]byte(`{"isnil":null,"notnil":1.15}`), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)

Вывод (попробуйтена игровой площадке Go ):

map[notnil:1.15 isnil:<nil>]
...