结构体成员称为字段,字段拥有自己的值和类型,且字段名字唯一,字段的类型也可以是结构体,甚至是字段所在结构体的类型
结构体定义格式:
type 类型名 struct{
字段1 类型 字段名大写开头表示公开访问
字段2 类型 字段名小写开头表示私有,仅在当前结构体中可以访问
}
type Point struct {
X int
Y int
}
可以直接Point.X=1进行赋值
结构体实例化
1. var p Point p.X/p.Y
2. p := new(Point)
3. p := &Point{}
2,3是创建指针类型的结构体
匿名结构体定义
1. msg := &struct { // 定义部分
id int
data string
}{ // 值初始化部分
1024,
"hello",
}
2. var msg struct{
id int;
data string
}//赋值
msg.id = 11
msg.data = "adw
结构体构造函数
typeTeststruct{
a,b,c,dint
}
funcnewTest(a,b,c,dint)*Test{
return&Test{
a:a,
b:b,
c:c,
d:d,
}
}
funcmain(){
n:=newTest(1,2,3,4)
fmt.Println(*n)
}
结构体的方法(任何类型都可以有方法)
func (接收者 接收者类型) 方法(参数列表)(返回值){
函数体
}
funcnewPerson(namestring,ageint)*Person{
return&Person{
name:name,
age:age,
接收者
指针类型的接收者:接收者类型是一个指针时可以修改结构体中的成员变量的值。
什么时候应该使用指针类型接收者
1. 需要修改接收者中的值
2. 接收者是拷贝代价比较大的大对象
3. 保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。
结构体的匿名字段:只有类型,没有字段名
type Person struct(
int
string
)
结构体与json序列化
结构体- ->json格式字符串
data, err := json.Marshal(c) json.Marshal(c)可以将结构体(可以是结构体指针也可以是结构体)转换为json格式的字符串
json格式字符串- ->结构体 *****(c1必须是指针类型)
err = json.Unmarshal([ ]byte(str), c1) json.Unmarshal([ ]byte(str), c1)将字符串str转换为结构体数据
标签:Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下: key1:"value1" key2:"value2"
使用键值对初始化结构体(赋值!=初始化)
ins := 结构体类型名{ /ins := &结构体类型名(对结构体指针初始化)
字段1: 字段1的值,
字段2: 字段2的值,
…
}
typePeoplestruct{
namestring
child*People 结构体成员中只能包含结构体的指针类型
}
relation:=&People{
name:"爷爷",
child:&People{
name:"爸爸",
child:&People{
name:"我", 结构体初始化时每行的结尾都要加逗号
}, 复合文字的换行符要加“,”
},
}