Go отсутствие ошибки при получении вызовет панику c, но ошибка при получении не вызовет панику - PullRequest
0 голосов
/ 12 июля 2020

Со следующим кодом:

var i interface{} = "hello"

f, ok := i.(float64)
fmt.Println(f, ok)

f = i.(float64) // panic
fmt.Println(f)

Почему не обнаружение ошибки вызовет pani c, но при обнаружении ошибки не вызовет pani c? Есть ли документация или сообщения в блоге, объясняющие эту концепцию?

1 Ответ

1 голос
/ 12 июля 2020

Это утверждение типа и задокументировано в Go spe c здесь :

Значение ok истинно, если утверждение выполняется. В противном случае это ложь, и значение v является нулевым значением для типа T. В этом случае не возникает паники во время выполнения.

При проверке на месте и несоответствии типов значение будет установлено "нулевое" значение типа float32 (число), поэтому 0.

Без проверки времени выполнения вы должны быть абсолютно уверены, что тип будет совпадать, а spe c диктует пани * Если нет, произойдет 1018 *.

Этот шаблон ничем не отличается от basi c проверка ошибок, например,

// v, err := someapi(). // Should check err ...

v, _ := someapi() // deliberately ignore error

v.SomeMethod() // ... Panic as v probably nil if there was an error

 
...