2016-05-14 68 views
13

作者在「Go in Action」一書中寫道:「兩種不同類型的值不能相互賦值,即使它們兼容」。爲什麼我可以爲變量分配不同類型的值?

例如,我們不能將Duration指定爲int64int64Duration

但是,這並不總是正確的,下面的任務將努力像X值轉換回[]int自動:

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

什麼是這兩種情況的區別?

回答

11

我將把你的spec這裏摘取最有意義的臺詞:

的X值是分配給類型T的變量在任何的這些(「x是分配給T」)例:

...

  • X的V型和T具有相同的基礎類型和V中的至少一種或T不是命名類型。

在您的示例的基礎類型是[]int每個案例和[]int不命名類型,但一個切片。一個int實際上會構成一個命名的類型(在宇宙中的塊預先聲明)和將具有本身作爲一個基本的類型,但[]int不是命名類型爲詳細here

布爾的命名實例,數字和字符串類型是 預先聲明的。可以使用 文字構造複合類型 - 數組,結構,指針,函數,接口,片,映射和通道類型。

每種類型T都有一個基礎類型:如果T是預先聲明的布爾型,數字或字符串類型 或類型文字之一,則相應的基礎類型是T本身。否則,T的相關 類型是T在其類型 聲明中引用的類型的基礎類型。

因此,如果你試圖使type X int能夠將其分配到var v intint被命名類型和做是不符合規範給出的可轉讓性標準。

相關問題