Утверждение нуля от int до int32 - PullRequest
0 голосов
/ 24 сентября 2019

Я заметил, что утверждение Go не работает, как я ожидаю для нуля int.Вот код:

var i interface{}
i = 0
i32, ok := i.(int32)
fmt.Println(ok)
fmt.Println(i32)

Вывод следующий:

false
0

Я не могу найти объяснение этого поведения.Это ошибка?

Ответы [ 2 ]

5 голосов
/ 24 сентября 2019

i не содержит int32, оно содержит int, и поэтому утверждение типа не выполняется.

Присваивание литерального значения непосредственно interface{}, как этот, или использование одногов коротком объявлении переменной может быть немного непонятно, потому что вы не видите, какой тип значения вы получаете;вам нужно знать правила для «типа по умолчанию» константы.Если это доставляет вам проблемы, вы можете явно привести его к типу, например i = int32(0), что гарантирует, что i действительно содержит int32.

3 голосов
/ 24 сентября 2019

Нет, это не ошибка, это хорошо определенное поведение.

Эта строка:

i = 0

Это назначение , и вы используете нетипизированный 0 целочисленная константа для присвоения i.Поскольку (конкретный) тип необходим для выполнения присваивания (а тип i s, являющийся interface{}, не определяет его), будет использоваться тип по умолчанию для этой нетипизированной константы, равный int.Прочитайте Блог Go: Константы :

Ответ заключается в том, что нетипизированная константа имеет тип по умолчанию, неявный тип, который передается значению, если тип нужен там, где его нет

Вы можете проверить это, если измените его следующим образом:

i2, ok := i.(int)
fmt.Println(ok)
fmt.Println(i2)

Какие выходные данные:

true
0

Если вы будете использовать напечатанныйконстанта:

i = int32(0)

Тогда да, сохраненное значение будет иметь тип int32, и вы получите тот же результат:

i = int32(0)
i32, ok := i.(int32)
fmt.Println(ok)
fmt.Println(i32)

Попробуйте примеры на Go Playground .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...