结构体:相当于"类"
1.结构体声明
type [name] struct {
[field_name] [field_type]
[field_name] [field_type]
...
}
//例子:
type Person struct {
name string
age int
}
其中field_name可以省略
2.结构体的使用
1) 格式1
var person Person
person.name = "jack"
person.age = 10
2)格式2:通过键值对声明
person := Person{
name: "jack",
age: 12, // 这里的逗号要加
}
// name age字段可以省略
3)格式3:匿名结构体
person := Person{
name string
age int
}{
name:"jack",
age:12,
}
4)格式4:通过new()函数实例化
var person = new(Person) //@doto new()返回的是结构体变量的地址
fmt.Println(&person) //0xc000006028
fmt.Println(person) //&{}
5)格式5:通过&运算符直接对结构体进行取地址操作,然后完成实例化
person := &Person{}
person.name = "xxx"
//@todo 说明:其实格式4,5,最合适的方式是通过 (*person).name = "xxx" 去赋值,只是Go语言自动帮助我们完成从地址取值的操作
3.结构体的构造方法
以上面的Person为例子,其实是通过一个函数来返回一个结构体指针实现的
func newPerson(name string, age int) *Person {
return &Person {
name: name,
age: age,
}
}
//main()方法中可以这样调用
p := newPerson("jack", 10)
4.结构体的方法(其实不限于结构体,比如可以为string添加)
通过接受者Receiver实现,方法的格式如下:
func (struct_var_name StructName) 函数名(params)(return_type) {
}
例子:
func (p Person) eat(food string) {
}
p := newPerson("jack", 10)
p.eat("鱼")
5.结构体的嵌套
type Person struct {
name string
age int
bodyInfo BodyInfo
}
type BodyInfo struct {
weight float64
height float64
}
p := Person{
name: "jack",
age: 10,
bodyInfo: BodyInfo{
weight: 100
height: 170
}
}
p.bodyInfo.weight //@todo 访问嵌套结构体的属性
6. 结构体的继承
type Dog struct {
age int
animal *Animal
}
type Cat struct {
age int
animal *Animal
}
type Animal struct {
name string
}
dog := &Dog{
age: 12,
animal: &Animal{
name: "myDog"
}
}