struct类型

Struct

摘录自 go语言实战

结构体是字段的集合。结构体定义的语法:

type Vertex struct {
	X int
	Y int
}

访问范围通过结构体和字段名的首字母大小写来体现:大写为public,小写为private。

构建结构体

可以通过值列表给结构体的各个字段赋值,新分配一个结构体,顺序和结构体定义的字段顺序一致。也可以通过使用 Name: 语法为单个字段赋值,未明确赋值的字段则取缺省值。

var (
	v1 = Vertex{1, 2}  // 类型为 Vertex
	v2 = Vertex{X: 1}  // Y:0 被省略
	v3 = Vertex{}      // X:0 和 Y:0
	p  = &Vertex{1, 2} // 类型为 *Vertex
)

特殊的前缀 & 返回一个指向结构体的指针。

访问字段

通过点号访问结构体的字段:

v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X)

也可以通过指针访问:

v := Vertex{1, 2}
p := &v
p.X = 1e9
fmt.Println(v)

Struct types

https://golang.org/ref/spec#Struct_types

结构体是命名元素(称为字段)的序列,每个字段都有name/名称和type/类型。字段名可以显式(IdentifierList)或隐式(EmbeddedField)指定。在结构体中,非空白的字段名必须是唯一的。

StructType    = "struct" "{" { FieldDecl ";" } "}" .
FieldDecl     = (IdentifierList Type | EmbeddedField) [ Tag ] .
EmbeddedField = [ "*" ] TypeName .
Tag           = string_lit .
// An empty struct.
struct {}

// A struct with 6 fields.
struct {
	x, y int
	u float32
	_ float32  // padding
	A *[]int
	F func()
}

一个声明了类型但没有显式字段名的字段称为嵌入式字段。嵌入式字段必须指定为类型名T或指向非接口类型名*T的指针,T本身不能是指针类型。非限定的类型名作为字段名。

// A struct with four embedded fields of types T1, *T2, P.T3 and *P.T4
struct {
	T1        // field name is T1
	*T2       // field name is T2
	P.T3      // field name is T3
	*P.T4     // field name is T4
	x, y int  // field names are x and y
}

以下声明是非法的,因为字段名在结构类型中必须是唯一的。

struct {
	T     // conflicts with embedded field *T and *P.T
	*T    // conflicts with embedded field T and *P.T
	*P.T  // conflicts with embedded field T and *T
}

如果x.f是表示该字段或方法f的合法选择器,那么结构体x中嵌入字段的字段或方法f被称为promoted(提升)。

被提升的字段与结构体的普通字段一样,只是它们不能在结构体的复合字面量中作为字段名使用。

给定一个结构类型S和一个已定义类型T,被提升的方法被包含在结构体的方法集中,具体如下:

  • 如果S包含一个嵌入字段T,那么S和*S的方法集都包含有接收者T的提升方法。*S的方法集还包括具有接收者*T的提升方法。
  • 如果S包含一个内嵌字段*T,那么S和*S的方法集都包含有接收者T或*T的被提升方法。

字段声明后面可以有一个可选的字符串字面量标签(tag),它成为对应字段声明中所有字段的属性。空的标签字符串相当于一个不存在的标签。标签通过反射接口变得可见,并参与结构体的类型识别,但在其他方面被忽略。

struct {
	x, y float64 ""  // an empty tag string is like an absent tag
	name string  "any string is permitted as a tag"
	_    [4]byte "ceci n'est pas un champ de structure"
}

// A struct corresponding to a TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers;
// they follow the convention outlined by the reflect package.
struct {
	microsec  uint64 `protobuf:"1"`
	serverIP6 uint64 `protobuf:"2"`
}

参考资料