- 声明使用结构体
func TestStruct(t *testing.T){
stu := struct{
name string
age int
}{"fangle",18}
t.Log(stu)
}
//result : {fangle 18}
是的上面的代码等价于
func TestStruct(t *testing.T){
var stu struct{
name string
age int
}
stu.name = "fangle"
stu.age = 18
t.Log(stu)
}
//result : {fangle 18}
这就是一个结构体的声明了。声明了一个有name和age 的结构体,并使用。并不需要type。
当然日常中,我们经常是这样用:
type student struct {
name string
age int
}
func TestStruct(t *testing.T){
var stu student
stu.name = "fangle"
stu.age = 18
t.Log(stu)
}
//result : {fangle 18}
使用type只是为了使用方便,给结构体定义一个别名。其实结构体的声明,和type无关。
- 创建结构体指针
func TestStruct(t *testing.T){
stuPtr := new(struct {
name string
age int
})
stuPtr.name = "fangle" //(*stuPtr).name
stuPtr.age = 18 //(*stuPtr).age
t.Log(stuPtr)
}
//result : &{fangle 18}
结构体指针不能使用 ->
访问结构体内的成员。结构体指针使用.
访问结构体成员时会自动转化为(*stuPtr)
- 结构体是值类型
type student struct {
name string
age int
}
func TestStruct(t *testing.T){
stu := student{"fangle",18}
stuImg := stu
stuPtr := &stu
stuPtr.name = "刀斧手何在"
t.Log(stuImg,stu,stuPtr)
}
//result : {fangle 18} {刀斧手何在 18} &{刀斧手何在 18}
在函数直接传递结构体,也是传递的结构体的拷贝。这点在后续的值接收者和指针接收者也会见到
- 包内私有成员变量被json序列化时忽略
type student struct {
Name string
age int
}
func TestStruct(t *testing.T){
stu := student{"fangle",18}
jsonData,err:= json.Marshal(stu)
t.Log(string(jsonData),err)
}
//result: {"Name":"fangle"} <nil>
- 使用struct tag 指定序列化规则
type student struct {
Name string `json:"名字"` //使用名字作为键名
age int `json:"age"` //小写开头忽略
School string `json:"-"` //主动设置忽略
Class string `json:"class,omitempty"` //使用class名字,空白时不加入序列化
Group string `json:",omitempty"` //使用默认名称,空白时不加入序列化
}
func TestStruct(t *testing.T){
stu := student{"fangle",18,"就是中学","","赛艇组"}
stu2 := student{"何在",20,"不是高中","唱诗班",""}
stuList := [...]student{stu,stu2}
jsonData,_:= json.Marshal(stuList)
t.Log(string(jsonData),stu,stu2)
}
//result : [{"名字":"fangle","Group":"赛艇组"},{"名字":"何在","class":"唱诗班"}]
// {fangle 18 就是中学 赛艇组} {何在 20 不是高中 唱诗班 }