Go結構型別
阿新 • • 發佈:2019-01-14
1.簡介
結構是已命名的元素序列,被稱為欄位,其中每一個元素都有一個名字和型別。 欄位名可顯示地指定(識別符號列表)或隱式地指定(匿名欄位)。 在結構中,非空白欄位名必須是唯一的。
// 空結構
struct {}
// 帶7個欄位的結構
type STest struct {
x, y int
u float32
_ float32 // 填充空白欄位
_ float64 // 填充空白欄位
A *[]int
F func()
}
2.匿名欄位
通過有型別而無顯式欄位名宣告的欄位為匿名欄位,亦稱為嵌入式欄位或型別的嵌入。 嵌入的型別必須是一個型別名 T 或一個非介面型別名的指標 *T, 且 T 本身不能為指標型別。未指定欄位名的型別名可以作為欄位名。
// 帶型別為T1,*T2,P.T3和*P.T4的4個匿名欄位的結構
struct {
T1 // 欄位名為T1
*T2 // 欄位名為T2
P.T3 // 欄位名為T3
*P.T4 // 欄位名為T4
x, y int // 欄位名為x和y
}
以下為非法宣告,因為欄位名在結構型別中必須是唯一的:
struct {
T // 與匿名欄位*T及*P.T相沖突
*T // 與匿名欄位T及*P.T相沖突
*P.T // 與匿名欄位T及*T相沖突
}
3.已提升的欄位與方法
在結構 x 中,若 x.f 為欄位方法 f 的合法選擇者,則匿名欄位的欄位或方法 f 即為已提升的。
已提升欄位除了不能用作該結構複合字面中的欄位名外, 其行為如同結構的一般欄位。
給定結構型別 S 與名為 T 的型別,包含在結構方法集中的已提升方法如下:
(1)若 S 包含一個匿名欄位 T,則 S 與 *S 的方法集均包含帶接收者 T 的已提升方法。*S 的方法集也包含帶接收者 *T 的已提升方法。
(2)若 S 包含匿名欄位 *T,則 S 與 *S 的方法集均包含帶接收者 T 或 *T 的已提升方法。
欄位宣告可後跟一個可選的字串字面 標註,成為所有相應欄位宣告中欄位的屬性。 標註可通過 反射介面 獲得,否則就會被忽略。
// 一個對應於時間戳協議快取的結構.
// 標註字串定義了協議快取的欄位號.
struct {
microsec uint64 "field 1"
serverIP6 uint64 "field 2"
process string "field 3"
}
參考文獻
[1]Go程式設計語言規範