GO语言基础教程14——结构体-结构体定义与实例化
Go语言中通过struct来实现面向对象
结构体定义
使用type和struct关键字来定义结构体,具体代码格式如下:
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
例如:
type person struct {
name string
age int
city string
}
同样类型的字段也可以写在一行。
type person1 struct {
name, city string
age int
}
结构体实例化
只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。
var 结构体实例 结构体类型
基本实例化
type person struct {
name string
city string
age int
}
func main() {
var p person
p.name = "likuis"
p.city = "福建"
p.age = 18
var p1 person
p1 = person{
name:"likuis",
age:18,
city:"福建",
}
fmt.Printf("p=%v\n", p) //p={likuis 福建 18}
fmt.Printf("p1=%v\n", p1) //p1={likuis 福建 18}
}
我们通过.来访问结构体的字段(成员变量),例如p1.name和p1.age等。
匿名结构体
在定义一些临时数据结构等场景下还可以使用匿名结构体。
package main
import (
"fmt"
)
func main() {
var user struct{Name string; Age int}
user.Name = "likuis"
user.Age = 18
fmt.Printf("%#v\n", user)
}
创建指针类型结构体
我们还可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址。
var p2 = new(person)
fmt.Printf("%T\n", p2) //*main.person
取结构体的地址实例化
使用&对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作。
p3 := &person{}
fmt.Printf("%T\n", p3) //*main.person
结构体初始化
没有初始化的结构体,其成员变量都是对应其类型的零值。
使用键值对初始化
p := person{
name: "likuis",
city: "福建",
age: 18,
}
当某些字段没有初始值的时候,该字段可以不写。此时,没有指定初始值的字段的值就是该字段类型的零值。
使用值的列表初始化
初始化结构体的时候可以简写,也就是初始化的时候不写键,直接写值:
p := person{
"likuis",
"福建",
18,
}
结构体内存布局
结构体占用一块连续的内存,(在 Go 中恰到好处的内存对齐)