go语言中结构体,就是字段的集合,类似面向对象中的类。
1.定义结构体
语法:
type 结构体类型名 struct {
字段集合
}
结构体可以包含任意数量的字段
例子:
type Vertex struct {
X int
Y int
}
定义Vertex结构体类型,包含两个int类型字段
2.初始化结构体
通过花括号,按顺序初始化字段值。
// X = 1, Y = 2
v := Vertex{1, 2}
明确的指定需要初始化的字段,未初始化的字段使用默认值
// X = 1, Y = 0
v := Vertex{X: 1}
// X = 1, Y = 100
v2 := Vertex{X: 1, Y: 100}
3.读写结构体字段
通过点访问结构体字段。
例子:
package main
import "fmt"
// 定义结构体Vertex
type Vertex struct {
X int
Y int
}
func main(){
// 初始化结构体变量v
v := Vertex{1, 2}
// 修改字段X的值
v.X = 4
// 打印X字段值
fmt.Println(v.X)
}
4.嵌套结构体
结构体字段类型可以是结构体类型
例子:
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:"tizi"}
// 打印字段值
fmt.Println(o.Id)
fmt.Println(o.User.Id)
fmt.Println(o.User.Username)
}
5.结构体指针
结构体指针的操作跟一般数据类型指针的操作不一样的地方是:结构体指针读写字段值不需要 * 号获取指针值。
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
// 初始化结构体变量v
v := Vertex{1, 2}
// 通过&取地址运算符,获取变量v的地址,赋值给指针变量p
p := &v
// 通过指针变量p操作字段,操作方式跟普通结构体变量一样
p.X = 1e9
fmt.Println(v)
}
通过例子,大家可以发现,读写字段值,是不是指针没什么区别。
6.结构体方法
结构体可以拥有方法(函数),结构体拥有方法后,结构体就类似面向对象的类。
结构体方法跟普通的函数的区别就是,结构体方法可以引用结构体变量的字段值。
结构体方法的语法:
func (结构体变量 结构体类型) 函数名(函数参数列表) (函数返回值列表) {
函数体
}
例子:
package main
import "fmt"
type Order struct {
Id int
ProductId int
}
// 为Order结构体,增加Print函数
func (v Order) Print() {
// 通过变量v引用Order结构体字段,类似其他语言的this指针
fmt.Println(v.Id)
fmt.Println(v.ProductId)
}
// 为结构体Order,添加Do函数
func (v *Order) Do(productId int) {
// 注意: 只有指针类型的结构体引用才可以修改字段值
// 修改结构体字段
v.ProductId = productId
}
func main() {
o := Order{1,100}
// 调用结构体的函数
o.Print()
o.Do(200)
o.Print()
}
输出:
1
100
1
200