Go结构类型

版权声明:感谢您对博文的关注!校招与社招,有需要内推腾讯的可以QQ(1589276509)or 微信(louislvlv)联系我哈,期待您的加入。 https://blog.csdn.net/K346K346/article/details/86441677

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编程语言规范

猜你喜欢

转载自blog.csdn.net/K346K346/article/details/86441677