版权声明:感谢您对博文的关注!校招与社招,有需要内推腾讯的可以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编程语言规范