一架梯子,一头程序猿,仰望星空!

go语言结构体(struct)


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