教程 > Go 教程 > Go 基础 阅读:796

Go 语言结构体(Struct) 详解

Go 语言中 Struct 结构体是用户定义的类型,表示字段的集合。Go 数组允许我们定义并保存多个相同类型数据项的变量。Struct 结构体是 Go 编程中可用的另一种用户定义的数据类型,它允许我们组合不同数据类型的数据项。

例如,员工有名字、姓氏和年龄。将这三个属性组合成一个名为Employee的结构体。

声明一个结构体

要定义结构体,必须使用type和struct语句。struct 语句定义了一种新的数据类型,为程序提供多个成员。type 语句将名称与类型绑定。

type Employee struct {  
    firstName string
    lastName  string
    age       int
}

上面的代码片段声明了一个Employee结构体,包含字段firstName、lastName和age。上面的Employee结构称为命名结构,因为它创建了一个新的数据类型。

通过在单行中声明属于相同类型的字段,后跟类型名称,也可以使该结构更加紧凑。在上面的结构体中firstName,lastName属于同一类型string,因此结构体可以改写为

type Employee struct {  
    firstName, lastName string
    age                 int
}

虽然上面的语法节省了几行代码,但它并没有使字段声明更简介方便,反而不易理解。尽量不要使用上述语法


创建命名结构体

让我们使用以下简单程序声明一个命名的结结构体 Employee。

package main

import (  
    "fmt"
)

type Employee struct {  
    firstName string
    lastName  string
    age       int
    salary    int
}

func main() {

    // 指定字段名称
    emp1 := Employee{
        firstName: "Sam",
        age:       25,
        salary:    500,
        lastName:  "Anderson",
    }

    // 不指定字段名称创建一个结构体
    emp2 := Employee{"Thomas", "Paul", 29, 800}

    fmt.Println("Employee 1", emp1)
    fmt.Println("Employee 2", emp2)
}

运行示例

上述代码执行结果如下

Employee 1 {Sam Anderson 25 500}
Employee 2 {Thomas Paul 29 800}

警告 - 在上面程序中,emp2 通过省略字段名称来定义结构体。在这种情况下,必须保持字段的顺序与结构体声明中指定的相同。请不要使用这种语法,因为它很难确定哪个值对应哪个字段。


访问结构体成员

要访问结构的任何成员,我们使用成员访问运算符 (.)。

package main

import (  
    "fmt"
)

type Employee struct {  
    firstName string
    lastName  string
    age       int
    salary    int
}

func main() {  
    emp6 := Employee{
        firstName: "Sam",
        lastName:  "Anderson",
        age:       55,
        salary:    6000,
    }
    fmt.Println("First Name:", emp6.firstName)
    fmt.Println("Last Name:", emp6.lastName)
    fmt.Println("年龄:", emp6.age)
    fmt.Printf("薪水: $%d\n", emp6.salary)
    emp6.salary = 6500
    fmt.Printf("涨薪后的薪资: $%d", emp6.salary)
}

运行示例

上述代码执行结果如下

First Name: Sam
Last Name: Anderson
年龄: 55
薪水: $6000

指向结构体的指针

我们可以像定义指向任何其他变量的指针一样定义指向结构体的指针,如下所示

var struct_pointer *Employee

现在,我们可以将结构体变量的地址存储在上面定义的指针变量中。要查找结构体变量的地址,需要将 & 运算符放在结构体名称之前,如下所示

struct_pointer = &emp6;

要使用指向该结构体的指针访问该结构体的成员,必须使用“.” 运算符

struct_pointer.firstName;

让我们使用结构体指针重写上面的例子

package main

import (  
    "fmt"
)

type Employee struct {  
    firstName string
    lastName  string
    age       int
    salary    int
}

func main() {  
    emp8 := &Employee{
        firstName: "Sam",
        lastName:  "Anderson",
        age:       55,
        salary:    6000,
    }
    fmt.Println("First Name:", (*emp8).firstName)
    fmt.Println("年龄:", (*emp8).age)
}

运行示例

上述代码执行结果如下

First Name: Sam
年龄: 55

上面程序中的emp8是一个指向Employee结构体的指针。(*emp8).firstName是访问结构体 emp8 的 firstName 字段。

Go 语言提供给我们另一种访问指向结构体指针的字段的方法——emp8.firstName。不是必须使用(*emp8).firstName来访问firstName字段。

func main() {  
    emp8 := &Employee{
        firstName: "Sam",
        lastName:  "Anderson",
        age:       55,
        salary:    6000,
    }
    fmt.Println("First Name:", emp8.firstName)
    fmt.Println("年龄:", emp8.age)
}

查看笔记

扫码一下
查看教程更方便