🌙 go结构体
- go结构体是由一系列称之为字段的命名元素组成,每个元素都有一个名称和类型
type identifier struct {
field1 type1
field2 type2
}
1
2
3
4
2
3
4
例如:
type People struct {
Name string
Age int
}
type Student struct {
class string
People // 匿名字段,那么默认Student就包含了Person的所有字段
int // 匿名字段
string // 匿名字段
}
// 空结构体
type Noop struct {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 结构体里的字段一般都有名字,像 field1、field2 等,如果字段在代码中从来也不会被用到,那么可以命名它为
_
type Demo struct {
x, y int
u float32
_ float32 // 填充
A *[]int
F func()
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 使用
new
函数给一个新的结构体变量分配内存,返回指向已分配内存的指针:
type S struct {
a int
b float64
}
// 使用new关键字
new(S)
1
2
3
4
5
6
2
3
4
5
6
new(S)
为S类型变量分配内存,并初始化(a=0, b=0.0),返回包含该位置地址类型*S
的值
- 结构体初始化方式
type MyStruct struct {
a int
b float
}
// 1. v结构体类型变量
var v MyStruct
// 2. p指向结构体类型变量的指针
var p *MyStruct
// 1.按字段顺序初始化
var m1 = MyStruct{1, 1.1}
// 2.指定字段名称初始化
var m2 = MyStruct{a: 1, b: 1.1}
var m3 = MyStruct{b: 1.2}
// 3.定义变量类型(分配内存,并零值化内存),然后赋值
var m4 MyStruct
m4.a = 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 结构体字面量
type Point3D struct { x, y, z float64}
type Line struct { p, q Point3D }
// 申明并初始化
var a = Point3D{}
var b = Line{a, Point3D{3, 4, 5.5}}
1
2
3
4
5
6
2
3
4
5
6
这里Point3D{}
和Point3D{3, 4, 5.5}
都是结构体字面量
new(T)
和&T{}
和T{}
- 表达式
new(T)
和&T{}
是等价的。&T{}
是一种简写,底层仍然会调用new
方法,返回结构体类型变量对应的指针。&T{}
不适用于内置类型。 T{}
指定结构体类型
- 表达式
带标签的结构体
type Student struct {
name string "学生姓名" // 结构体标签
Age int "学生年龄" // 结构体标签
Class int `json: cid` // 结构体标签
}
1
2
3
4
5
2
3
4
5
通过
reflect.TypeOf(T).Field(0).Tag
方式可以获取结构体标签的内容