type user struct{
id int
score float32
enrollment time.Time
name, addr string//多个字段类型相同时可以简写到一行里}
声明和初始化结构体
funcmain(){
var u user //声明,会用相应类型的默认值初始化struct里的每一个字段
u = user{
}//用相应类型的默认值初始化struct里的每一个字段
u = user{
id:3, name:"zcy"}//赋值初始化
u = user{
4,100.0, time.Now(),"zcy","beijing"}//赋值初始化,可以不写字段名,但需要跟结构体定义里的字段顺序一致}
默认值初始化结构体
funcmain(){
var u user
fmt.Printf("id=%d, enrollment=%v, name=[%s], addr=[%s]\n", u.id, u.enrollment, u.name, u.addr)// id=0, enrollment=0001-01-01 00:00:00 +0000 UTC, name=[], addr=[]}
二、结构体访问与修改
访问与修改结构体
funcmain(){
var u user
u.enrollment = time.Now()//给结构体的成员变量赋值
fmt.Printf("id=%d, enrollment=%v, name=%s\n", u.id, u.enrollment, u.name)//访问结构体的成员变量// id=0, enrollment=2023-02-14 10:25:46.006792 +0800 CST m=+0.002123701, name=}
成员方法:
type user struct{
id int
score float32
enrollment time.Time
name, addr string//多个字段类型相同时可以简写到一行里}// 可以把user理解为hello函数的参数,即hello(u user, man string)func(u user)hello(man string){
fmt.Println("hi "+ man +", my name is "+ u.name)}funchello(u user, 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?")}funcmain(){
ws := user{
id:0, name:"gogo"}
ws.hello("test")//hi test, my name is gogohello(ws,"test")//hi test, my name is gogo}
为自定义类型添加方法
type UserMap map[int]user //自定义类型// 可以给自定义类型添加任意方法func(um UserMap)GetUser(id int) user {
return um[id]}
// 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)}
四、结构体嵌套
结构体嵌套
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 =0type vedio struct{
length int
name string
user//匿名字段,可用数据类型当字段名}