Go两周入门系列-结构体(struct)

2023-09-28 11:16:21 浏览数 (2)

go语言中结构体,就是字段的集合,类似面向对象中的类。

1.定义结构体

语法:

代码语言:javascript复制
type 结构体类型名 struct {
    字段集合
}

结构体可以包含任意数量的字段

例子:

代码语言:javascript复制
type Vertex struct {
    X int
    Y int
}

定义Vertex结构体类型,包含两个int类型字段

2.初始化结构体

通过花括号,按顺序初始化字段值。

代码语言:javascript复制
// X = 1, Y = 2
v := Vertex{1, 2}

明确的指定需要初始化的字段,未初始化的字段使用默认值

代码语言:javascript复制
// X = 1, Y = 0
v := Vertex{X: 1}

// X = 1, Y = 100
v2 := Vertex{X: 1, Y: 100}

3.读写结构体字段

通过点访问结构体字段。

例子:

代码语言:javascript复制
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.嵌套结构体

结构体字段类型可以是结构体类型

例子:

代码语言:javascript复制
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:"xj"}

    // 打印字段值
    fmt.Println(o.Id)
    fmt.Println(o.User.Id)
    fmt.Println(o.User.Username)
}

5.结构体指针

结构体指针的操作跟一般数据类型指针的操作不一样的地方是:结构体指针读写字段值不需要 * 号获取指针值。

代码语言:javascript复制
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.结构体方法

结构体可以拥有方法(函数),结构体拥有方法后,结构体就类似面向对象的类。

结构体方法跟普通的函数的区别就是,结构体方法可以引用结构体变量的字段值。

结构体方法的语法:

代码语言:javascript复制
func (结构体变量 结构体类型) 函数名(函数参数列表) (函数返回值列表) {
    函数体
}

例子:

代码语言:javascript复制
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()
}

输出:

代码语言:javascript复制
1
100
1
200

源文:https://www.tizi365.com/

Go两周入门系列

Go两周入门系列-Golang介绍

Go两周入门系列-go语言开发环境

Go两周入门系列-基本数据类型

Go两周入门系列-运算符

Go两周入门系列-指针

Go两周入门系列-流程控制语句

Go两周入门系列-函数

Go两周入门系列-数组和切片(slice)

0 人点赞