GO语言基础教程14——结构体-结构体定义与实例化
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
等。
匿名结构体
在定义一些临时数据结构等场景下还可以使用匿名结构体。
var p2 = new(person) fmt.Printf("%T\n", p2) //*main.person
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 中恰到好处的内存对齐)