Go语言Struct详解:声明、指针操作与嵌入机制
GO语言的结构(struct)功能类似于面向对象编程中的类(class),但去除了构造函数等复杂机制。本文将从基础的声明初始化、指针引用机制到高级的匿名与嵌入结构使用,全面解析Golang中struct的核心应用。
声明结构体并初始化实例
在Go语言中,struct用于定义自定义的数据类型。声明结构体后,可以通过多种方式创建实例并进行初始化。
第1步:定义结构体类型
使用 type 关键字配合 struct 定义包含多个字段的数据类型。例如,定义一个名为 Person 的结构:
package main
import "fmt"
type Person struct {
Age int
Name string
}
第2步:创建并初始化实例
可以使用零值初始化或指定值初始化。以下是两种常见方式的对比:
- 方法一(逐段赋值):先创建空结构体,再对字段进行赋值。
- 方法二(字面量初始化):在创建时直接指定所有字段的值,更为简洁。
复制代码 代码如下:
func main() {
// 初始化方式1:逐个字段赋值
a := Person{}
a.Age = 2
a.Name = "widuu"
fmt.Println(a)
// 初始化方式2:直接在声明时赋值
b := Person{
Age: 24,
Name: "widuu",
}
fmt.Println(b)
}使用指针修改结构体数值
当需要传递较大的数据结构或在函数内修改原始对象的值时,应使用指向结构体的指针。获取内存地址后,可以在该引用上直接改变其属性。
第3步:实现基于指针的结构体传参
通过 & 符号获取结构体地址,并在函数中接收 *Person 类型的参数进行修改:
复制代码 代码如下:
package main
import "fmt"
type Person struct {
Age int
Name string
}
func main() {
// 获取结构体指针
b := &Person{
Age: 24,
Name: "widuu",
}
fmt.Println("初始状态:", b)
// 调用函数修改指针指向的值
G(b)
fmt.Println("修改后:", b) // 此时Age会被更新为15
}
func G(per *Person) {
per.Age = 15 // 通过指针修改变量
fmt.Println("函数内:", per)
}处理匿名结构与嵌套结构
Go语言的struct支持匿名结构(Inline Struct)和结构体嵌套,这为实现类似“继承”或多重组合的功能提供了可能。
第4步:创建和使用匿名结构
可以在不使用 type 声明的情况下,直接在变量声明处定义结构体。这种方式适用于只需要单次使用的小型数据结构:
复制代码 代码如下:
func main() {
a := struct {
name string
Age int
}{
name: "widuu",
Age: 19,
}
fmt.Println(a)
}第5步:构建内部嵌套结构
如果结构体内部还包含另一个结构体,可以通过点号(`.`)层级访问内部字段:
复制代码 代码如下:
package main
import "fmt"
type Person struct {
Age int
Name string
Member struct {
phone, City string
}
}
func main() {
a := Person{Age: 16, Name: "widuu"}
a.Member.phone = "13800000"
a.Member.City = "widuuweb"
fmt.Println(a)
}第6步:实现类继承效果的嵌入结构
通过将另一个结构体作为当前结构体的字段(不写字段名,仅写类型名),可以实现结构体的嵌入。这使得外部结构可以直接调用被嵌入结构的公共方法:
复制代码 代码如下:
package main
import "fmt"
type Person struct {
Name string
Age int
}
type Student struct {
Person // 嵌入式结构,默认可通过Student的属性直接访问Name和Age
Work string
}
func main() {
// 实例化:由于嵌入了Person,必须显式初始化Person部分
a := Student{
Person: Person{Name: "widuu", Age: 19},
Work: "IT",
}
fmt.Println(a)
}第7步:添加结构体专属的方法
可以针对不同结构体定义同名方法,Go会通过结构体类型来区分调用的具体实现:
复制代码 代码如下:
package main
import "fmt"
type A struct {
Name string
}
type B struct {
Name string
}
func main() {
a := A{}
b := B{}
a.print() // 输出 A
b.print() // 输出 B
}
func (a *A) print() {
fmt.Println("A")
}
func (b *B) print() {
fmt.Println("B")
}本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













