1. 程式人生 > >Go結構型別

Go結構型別

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程式設計語言規範