type user struct { id int score float32 enrollment time.Time name, addr string//多个字段类型相同时可以简写到一行里 }
声明和初始化结构体
1 2 3 4
var u user //声明,会用相应类型的默认值初始化struct里的每一个字段 u = user{} //用相应类型的默认值初始化struct里的每一个字段 u = user{id: 3, name: "zcy"} //赋值初始化 u = user{4, 100.0, time.Now(), "zcy", "beijing"} //赋值初始化,可以不写字段名,但需要跟结构体定义里的字段顺序一致
//可以把user理解为hello函数的参数,即hello(u user, man string) func(u user)hello(man string) { fmt.Println("hi " + man + ", my name is " + u.name) } //函数里不需要访问user的成员,可以传匿名,甚至_也不传 func(_ user)think(man string) { fmt.Println("hi " + man + ", do you know my name?") }
//user传的是值,即传的是整个结构体的拷贝。在函数里修改结构体不会影响原来的结构体 funchello(u user, man string) { u.name = "杰克" fmt.Println("hi " + man + ", my name is " + u.name) } //传的是user指针,在函数里修改user的成员会影响原来的结构体 funchello2(u *user, man string) { u.name = "杰克" fmt.Println("hi " + man + ", my name is " + u.name) } //把user理解为hello()的参数,即hello(u user, man string) func(u user)hello(man string) { u.name = "杰克" fmt.Println("hi " + man + ", my name is " + u.name) } //可以理解为hello2(u *user, man string) func(u *user)hello2(man string) { u.name = "杰克" fmt.Println("hi " + man + ", my name is " + u.name) }
结构体嵌套
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
type user struct { name string sex byte } type paper struct { name string auther user //结构体嵌套 } p := new(paper) p.name = "论文标题" p.auther.name = "作者姓名" p.auther.sex = 0
type vedio struct { length int name string user//匿名字段,可用数据类型当字段名 }