ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> go语言中结构体,就是字段的集合,类似面向对象中的类。 [TOC] ## 定义结构体 > 语法 ~~~ type 结构体名称 struct { 字段集合 } ~~~ > 如下 ~~~ type Book struct { title string author string } ~~~ ## 结构体初始化 ~~~ // 方式1:按顺序初始化字段值 book := Book{"Go 语言", "xk"} // 方式2:指定字段初始化(推荐) book2 := Books{title: "Go 语言", author: "wx"} // 忽略的字段为0 或 空 book3 := Books{title: "Go 语言"} // 字段的读写 book2.title = "new book" fmt.Println(book2.title) ~~~ ## 结构体方法 > 结构体可以拥有方法(函数),结构体拥有方法后,结构体就类似面向对象的类。 > 结构体方法的语法: ~~~ func (结构体变量名 结构体类型) 函数名(函数参数列表) (函数返回值列表) { 函数体 } ~~~ > 例子 ~~~ package main import ( "fmt" ) //定义Student结构体 type Student struct { Name string Age int } // 定义Student方法 func (stu *Student) SayHello() string { return "Hello " + stu.Name } func (stu *Student) SetName(name string) { stu.Name = name } func main() { s1 := Student{} s1.Name = "wangkun" s1.SetName("jiaojiao") fmt.Println(s1.SayHello()) } ~~~ ## 结构体指针 ~~~ package main import ( "fmt" ) type Book struct { title string author string } func main() { book := Book{title: "go语言", author: "wk"} // 定义了一个结构体指针 var book_pointer *Book book_pointer = &book // 读写结构体指针,假如修改了指针的字段,实际的引用对应的字段也变化 fmt.Println(book_pointer.title) book_pointer.author = "jj" fmt.Println(book) } ~~~ ## 结构体作为函数参数 > 结构体作为函数参数有两种方式:传值 和 传引用 ~~~ package main import ( "fmt" ) type Student struct { name string age int } // 传值:调用函数时将实际参数复制一份传递到函数中,对参数的修改不会影响实际参数 func Test1(s Student) { fmt.Println("名称:" + s.name) // 非指针的类型引用,只能用来读取操作 // 当传入的参数不是指针类型,以下修改操作不生效 s.name = "wk" s.age = 22 } // 传引用:调用函数时将实际参数的地址直接传递到函数中,对参数进行修改,将影响到实际参数。 func Test2(s *Student) { s.name = "wk" s.age = 22 } func main() { student := Student{name: "init", age: 0} Test1(student) fmt.Println(student) //输出结果:{init 0} Test2(&student) fmt.Println(student) //输出结果:{wk 22} } ~~~ ## 嵌套结构体 > 结构体字段类型可以是结构体类型 ~~~ package main import "fmt" // 定义UserInfo结构体类型 type UserInfo struct { Id int Username string } // 定义Order结构体 type Order struct { Id int User UserInfo // User字段的类型是UserInfo结构体类型 } func main() { // 初始化结构体 o := Order{} o.Id = 100 // 通过UserInfo结构体初始化User字段 o.User = UserInfo{Id: 1, Username: "wk"} // 打印字段值 fmt.Println(o.Id) fmt.Println(o.User.Id) fmt.Println(o.User.Username) } ~~~