Подтвердить что ты не робот

Почему я могу присвоить переменную значение другого типа?

В книге "Перейти в действие" автор написал: "Значения двух разных типов не могут быть назначены друг другу, даже если они совместимы".

Например, мы не можем назначить Duration на int64 или int64 на Duration.

Но это не всегда так, следующее присваивание будет работать так, как будто значение X автоматически преобразуется в []int:

type X []int
var v []int = X([]int{1, 2, 3})

Какая разница между этими двумя ситуациями?

4b9b3361

Ответ 1

Я передам вам spec и выберет наиболее значимые строки здесь:

Значение x присваивается переменной типа T ( "x присваивается T" ) в любом из этих случаев:

...

  • x тип V и T имеют одинаковые базовые типы, и по крайней мере один из V или T не является именованным типом.

В вашем примере базовый тип []int для каждого случая, а []int - не именованный тип, а срез. int фактически будет представлять собой именованный тип (предварительно обозначенный в блоке юниверса) и будет иметь в качестве базового типа, но []int не является именованным типом, как подробный здесь:

Именованные экземпляры логических, числовых и строковых типов предопределенное. Составные типы: массив, структура, указатель, функция, интерфейс, срез, карта и типы каналов - могут быть построены с использованием типа литералы.

Каждый тип T имеет базовый тип: если T является одним из предопределенных boolean, numeric или string, или литерал типа, соответствующий базовый тип - сам T. В противном случае T type - это тип типа, к которому относится T в своем типе декларация.

Поэтому, если вы попытались сделать type X int, вы не сможете назначить его var v int, поскольку int является именованным типом и не будет удовлетворять критериям назначения, указанным в спецификации.