Go 语言中结构体(Struct)的使用

  • Post author:
  • Post category:其他




简介

Go 语言是一门典型的面向对象编程语言,同时也支持复杂的数据结构,其中最常用的就是结构体。

结构体(Struct)是一组不同类型的变量的集合,可以像一个单一的变量一样使用,可以包含其他结构体或嵌套的结构体。在 Go 语言中,结构体是一种自定义类型,可以定义在函数外部,并且可以定义方法。



定义结构体

定义结构体的语法如下:

type Person struct {
    Name     string
    Age      int
    Gender   string
    Address  string
}

上面的语法就定义了一个名为 Person 的结构体,其包含四个字段:Name、Age、Gender 和 Address,这四个字段分别是 string、int、string 和 string 类型。



创建结构体对象

结构体定义好之后,可以使用该结构体来创建对象。下面这段代码演示了如何使用定义好的 Person 结构体来创建一个 person 对象:

person := Person{
    Name    : "Tom",
    Age     : 25,
    Gender  : "male",
    Address : "ShenZhen",
}

上面的代码就创建了一个名为 person 的 Person 结构体对象,并设置了其属性值。

访问结构体成员

可以使用句点运算符 . 来访问结构体中的成员。例如,要访问 person 结构体对象中的 Name 属性,可以使用以下代码:

fmt.Println(person.Name)

打印结果为 “Tom”。



结构体嵌套

结构体可以定义在其他结构体中,从而实现结构体嵌套的功能。例如,一个嵌套在 Person 结构体中的 Address 结构体可以定义如下:

type Address struct {
    Province     string
    City         string
    Street       string
    HouseNumber  string
}

type Person struct {
    Name     string
    Age      int
    Gender   string
    Address  Address
}

上面的代码就定义了一个名为 Address 的结构体和一个名为 Person 的结构体,在 Person 结构体中嵌套了 Address 结构体,从而实现了结构体的嵌套功能。



结构体方法

在 Go 语言中,结构体还可以定义方法,即与结构体相关联的函数。在方法定义中,可以使用结构体的成员来执行一些操作。

下面这段代码就定义了一个名为 SayHello 的方法,该方法属于 Person 结构体:

type Person struct {
    Name     string
    Age      int
    Gender   string
    Address  Address
}

func (p Person) SayHello() {
    fmt.Println("Hello, my name is", p.Name)
}

上面的代码中,方法的定义类似于函数的定义,但在方法名前面加上了 (p Person) 这个结构体定义,表示将该方法绑定到 Person 结构体中。SayHello 方法将输出 “Hello, my name is” 加上该 person 对象的名字。

使用结构体对象调用方法的方式如下:

person := Person{
    Name    : "Tom",
    Age     : 25,
    Gender  : "male",
    Address : "ShenZhen",
}
person.SayHello()

打印结果为 “Hello, my name is Tom”。

在 Go 语言中,结构体(struct)的大小写规则会影响结构体及其字段是否能被跨包访问。按照 Go 语言的结构体大小写规则,如下:



可见性

小写字母开头的结构体和结构体字段仅能在同一个包中访问,不能跨包访问。

大写字母开头的结构体和结构体字段可以在不同的包中被访问,是公共的(public)。

这是因为在 Go 语言中,变量、常量、函数等标识符的大小写决定了它们的可见性(visibility),即能否被其他包访问。因此,如果希望将结构体和结构体字段公开(对外可见),则需要使用大写字母开头的标识符。

举个例子,假设我们有以下代码:

// person/person.go 文件
package person

// 定义一个结构体
type Person struct {
    name  string
    age   int
}

// main.go 文件
package main

import "fmt"
// 此处的 test 是当前 go mod的模块名称, 自行修改
import "test/person"

func main() {
    // 创建一个 Person 变量
    p := person.Person{"Alice", 18}
    // 打印变量
    fmt.Printf("%v\n", p.name)
}

由于结构体字段都是小写字母开头的,因此在 main 函数中无法直接访问这些字段,编译错误。需要将字段改为大写字母开头才能被跨包访问,例如:

// person/person.go 文件
package person

// 定义一个结构体
type Person struct {
    Name string
    Age  int
}

// main.go 文件
package main

import "fmt"
// 此处的 test 是当前 go mod的模块名称, 自行修改
import "test/person"

func main() {
    // 创建一个 Person 变量
    p := person.Person{"Alice", 18}
    // 打印变量
    fmt.Printf("%v\n", p.name)
}

在这个例子中,Person 结构体的 Name 和 Age 字段被定义为公开的(public),在 main 函数中可以通过访问 p.Name 来获取结构体实例 p 的名称。

同样的道理, 结构体的方法名称和结构体本身名称也是符合这个规则的.



结论

结构体是 Go 语言中一种强大的自定义类型,它可以包含任意数量的数据类型,甚至可以包括其他结构体或者嵌套结构体。结构体提供了一种方便的方式,让开发者能够轻松地管理复杂的数据集合。同时,结构体还具有定义方法的功能,可以与其他类型一起工作,更加方便实现面向对象编程的功能。



版权声明:本文为qq_21047625原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。