Нет, это не ошибка, это хорошо определенное поведение.
Эта строка:
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 .