首页 > 编程笔记 > Go语言笔记 阅读:1

Go语言结构体的定义和使用(非常详细)

Go 语言的数组只能存储同一类型的数据。要为不同项定义不同的数据类型应该如何使用 Go 语言处理呢?为此,Go语言提出了结构体的概念。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体表示一项记录,例如,保存 4S 店在售汽车的信息,每辆车都有品牌、颜色、出厂日期和价格等属性。

大多数编程语言都使用 class 关键字定义类,但在 Go 语言中没有“类”的概念。它使用更加灵活的“结构体”代替传统的“类”。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,每项数据都是结构体的一个成员。

在 Go 语言中,数组和切片可以存储同一类型的数据,而在结构体中可以为不同成员定义不同的数据类型。结构体成员也称为元素或字段,它有以下两个特性:

Go语言结构体的定义

定义结构体使用 type 和 struct 关键字。定义结构体的基本语法格式如下:
type name struct {
    member datatype
    member datatype
    ...
}
参数说明如下:
定义表示个人简介的结构体 profile,其中包括成员 name、age 和 interest,分别表示姓名、年龄和兴趣爱好。代码如下:
type profile struct {
    name string
    age int
    interest []string
}

Go语言结构体的实例化

定义结构体之后,还要实例化才能使用结构体中的成员。实例化就是为结构体中的成员赋值。在 Go语言中,结构体有多种实例化方法,根据实际需要可以选用不同的方法。

1) 在结构体名称后直接赋值

在结构体名称后面使用大括号进行实例化,同时为每个成员设置值。

例如,使用该方法实例化 profile 结构体,并访问结构体的成员,代码如下:
package main

import (
    "fmt"
)

type profile struct {
    name   string
    age    int
    interest []string
}

func main() {
    p1 := profile{name: "Tony", age: 20, interest: []string{"运动", "旅游", "看电影"}}
    //访问成员
    fmt.Printf("姓名:%v\n", p1.name)
    fmt.Printf("年龄:%v\n", p1.age)
    fmt.Printf("兴趣爱好:%v\n", p1.interest)
}
运行结果如下:

姓名:Tony
年龄:20
兴趣爱好:[运动 旅游 看电影]

访问结构体成员需要使用点(.)操作符,格式为“结构体实例名称.成员名”。


没有为某个成员设置值时,该成员使用默认值。例如,在实例化 profile 结构体时只设置成员 name 和 interest 的值,代码如下:
p1 := profile{name: "Tony", interest: []string{"运动", "旅游", "看电影"}}
再次运行程序,成员 age 的值显示为 0。

2) 定义结构体变量再赋值

结构体本身也是一种类型,可以使用 var 关键字声明结构体的方式完成实例化。

例如,实例化结构体 profile,并为结构体成员赋值,再访问结构体的成员,关键代码如下:
func main() {
    var p2 profile //实例化结构体
    //对结构体成员赋值
    p2.name = "Tony"
    p2.age = 20
    p2.interest = []string{"运动", "旅游", "看电影"}
    //访问成员
    fmt.Printf("姓名:%v\n", p2.name)
    fmt.Printf("年龄:%v\n", p2.age)
    fmt.Printf("兴趣爱好:%v\n", p2.interest)
}
在上述代码中,p2 即创建的结构体实例。运行结果为:

姓名:Tony
年龄:20
兴趣爱好:[运动 旅游 看电影]

3) 使用new()函数实例化

使用 Go 语言内置的 new() 函数也可以实例化结构体。使用这种方式创建的结构体实例是指针类型。

例如,使用该方法实例化结构体 profile,然后对结构体成员进行赋值,再访问结构体的成员,关键代码如下:
func main() {
    p3 := new(profile) //实例化结构体
    //对结构体成员赋值
    p3.name = "Tony"
    p3.age = 20
    p3.interest = []string{"运动", "旅游", "看电影"}
    //访问成员
    fmt.Printf("姓名:%v\n", p3.name)
    fmt.Printf("年龄:%v\n", p3.age)
    fmt.Printf("兴趣爱好:%v\n", p3.interest)
}
运行结果为:

姓名:Tony
年龄:20
兴趣爱好:[运动 旅游 看电影]

4) 取结构体的地址进行实例化

使用取地址操作符“&”实例化结构体。使用该方法实例化结构体 profile 的关键代码如下:
func main() {
    p4 := &profile{} //实例化结构体
    //对结构体成员赋值
    p4.name = "Tony"
    p4.age = 20
    p4.interest = []string{"运动", "旅游", "看电影"}
    //访问成员
    fmt.Printf("姓名:%v\n", p4.name)
    fmt.Printf("年龄:%v\n", p4.age)
    fmt.Printf("兴趣爱好:%v\n", p4.interest)
}
运行结果为:

姓名:Tony
年龄:20
兴趣爱好:[运动 旅游 看电影]

相关文章