Go 语言中结构体(Struct)的使用
创始人
2025-05-29 00:57:40

文章目录

    • 简介
    • 定义结构体
    • 创建结构体对象
    • 结构体嵌套
    • 结构体方法
    • 可见性
    • 结论

简介

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

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

定义结构体

定义结构体的语法如下:

type Person struct {Name     stringAge      intGender   stringAddress  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     stringCity         stringStreet       stringHouseNumber  string
}type Person struct {Name     stringAge      intGender   stringAddress  Address
}

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

结构体方法

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

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

type Person struct {Name     stringAge      intGender   stringAddress  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),即能否被其他包访问。因此,如果希望将结构体和结构体字段公开(对外可见),则需要使用大写字母开头的标识符。

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

package main// 定义一个结构体
type Person struct {name  stringage   int
}func main() {// 创建一个 Person 变量p := Person{"Alice", 18}// 打印变量fmt.Printf("%v\n", p)
}

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

package mainimport "fmt"// 定义一个结构体
type Person struct {Name stringAge  int
}func main() {// 创建一个 Person 变量p := Person{"Alice", 18}// 访问 Name 字段fmt.Printf("Name: %v\n", p.Name)
}

在这个例子中,Person 结构体的 Name 和 Age 字段被定义为公开的(public),在 main 函数中可以通过访问 p.Name 来获取结构体实例 p 的名称。
同样的道理, 结构体的方法名称和结构体本身名称也是符合这个规则的.

结论

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

相关内容

热门资讯

今年我省粮食产量达515.56... (来源:辽宁日报)转自:辽宁日报 图为在中储粮(盘锦)储运有限公司,装运粮食的重型卡车排起长队...
国家发展改革委部署促进投资止跌... (来源:辽宁日报)转自:辽宁日报 新华社北京12月13日电 (记者魏玉坤) 记者13日从全国发展和改...
江苏省实施《中华人民共和国森林... (来源:新华日报) 目 录 第一章 总则 第二章 森林、林木和林地权属管理...
姜堰数字化产品讲“活”理论 (来源:新华日报) □ 本报记者 卢佳乐 通讯员 姜宣 “王教授,您约我‘喝茶论道’,...
联合国维和部队在苏丹遇袭 6人... 转自:财联社【联合国维和部队在苏丹遇袭 6人死亡】财联社12月14日电,当地时间13日,苏丹武装部队...