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