go中的type
-
type分三類
- 預宣告標識型別,基本就是boolean,numeric and string
- 複合型別,如:map slice arry struct interface pointer function channel 這些使用(type字面量)構造的型別
-
自宣告型別,分兩種:
var Age int // 型別定義 var Int = int // 類型別名
-
型別定義,type: 一人千面
- 建立了一個完全新的型別,與其所基於的型別是兩個不同的型別。
- 不繼承底層型別的方法,但會繼承底層型別的元素(如果是interface型別,那麼其方法集也會保留下來,在我看interface的方法集實際上類似於欄位)
- 類型別名,類型別名是給某個型別起的別名,該別名本質上依然是該型別。
-
-
底層型別,每一個type都有其底層型別,1和2類的底層型別都是其本身,3的底層型別視情況而定。
type ( A1 = string A2 = A1 ) type ( B1 string B2 B1 B3 []B1 B4 B3 )
A1,A2,B1,B2的底層型別都是string,B3,B4的底層型別都是[]B1
-
介面型別(interface type),推薦看Go介面深入解析
interface {}
type ReadWriter interface { Read(b Buffer) int Write(b Buffer) int } type File interface { ReadWriter Close() }
-
結構體型別,結構體是命名元素的序列,我們稱這些命名元素為欄位,每個欄位都有名字(name)和型別(type)。非空欄位的名字必須唯一,欄位可以顯式或者隱式(一個欄位只有type而沒有名字)的指定。
- 隱式欄位稱為嵌入欄位。嵌入欄位要麼是個型別,要麼是個非介面型別的指標型別。
typt T struct { name string } type T1 struct { value int // 正常欄位 int // 嵌入欄位:int型別 *T// 嵌入欄位:指向型別T的指標型別 }
- 如果一個 type T1 被嵌入另一個 type T 作為它的 filed,T1 的所有 field 和 method 都可以在 T 中使用
- 空結構體 ,重要的是其記憶體消耗等於0。