结构体
-
定义
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。
type struct_variable_type struct { member definition member definition ... member definition }
定义与初始化
type Books struct { title string author string subject string book_id int } func main() { // 创建一个新的结构体 fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407}) // 也可以使用 key => value 格式 fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407}) // 忽略的字段为 0 或 空 fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"}) }
-
匿名结构体
多用于临时场景
func main(){ var s struct{ x string y int } s.x = "hh" x.y = 99 fmt.Printf("%T\n", s) }
-
结构体指针
// 创建指针类型结构体 var p2 = new(person)
var struct_pointer *Books // 声明变量 struct_pointer = &Book1 // 变量赋值 struct_pointer.title // 访问结构体成员
-
构造函数
返回一个结构体变量的函数
type person struct{ name string age int } // 自己写一个函数用于相应结构体的初始化 func newPPerson(name string, age *int) *person{ return &person{ name := name age := age } }
-
方法和接收者
Go语言中,方法(Method)是一种用于特定变量的函数。这种特定的类型变量叫做
接收者(Receiver)
。接收者的概念类似其他语言的this
、self
语法格式:
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数){ 函数体 }
其中:
- 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者的第一个小写字母,而不是
self
、this
之类的命名。 - 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型
- 方法名:参数列表、返回参数:具体格式与函数定义相同
方法与函数的区别是:函数不属于任何类型、方法属于特定的类型。
为了保持一致性,如果有某个方法使用了指针接收者,那么其他方法也应该采用指针接收者
例:
package main // 共有结构体必须写注释 // Dog 这是一个共有结构体 type Dog struct{ name string } func newPDog(name string) *Dog{ return &Dog{ name := name, } } // 方法是作用于特定发类型的函数 // 接收者表示的是调用该方法的具体类型变量,多用类型名首字母表示 func (d dog) wang(){ fmt.Printf("%s: 汪汪汪~", d.name) } func main(){ d1 := newDog("zhoulin") d1.wang() }
- 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者的第一个小写字母,而不是
-
匿名嵌套结构体
在结构体成员访问时,可以直接访问嵌套结构体中的成员
type address struct{ province string city string } type person struct{ name string age int address // 匿名嵌套结构体 } func main(){ p1 := person{ name: "zgh", age: 100, address: address{ province: "山东", city: "泰安", } } // 通过匿名结构体可以直接找到相应的成员 fmt.Println(p1.city) }
-
模拟继承
type animal struct{ name string } func (a animal) move(){ ... } type dog struct{ feet int animal // animal拥有的方法,此时dog也有了 }