2016-05-14 5 views
13

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

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

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

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

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

ответ

11

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

Значение х присваиваемые переменной типа Т («х присваиваемые Т») в любой из них случаи:

...

  • крестиков типа V и Т имеют одинаковые типы, лежащие в основе и, по меньшей мере, один из V или Т не именованный тип.

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

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

Каждого типа Т имеет базовый тип: Если T является одним из предопределенного булевых, типов числовой, или строковых или типа буквального, то , соответствующие базовый типа сам по себе Т. В противном случае T-тип является базовым типом типа, к которому T относится к типу .

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

Смежные вопросы