Go语言Struct详解:声明、指针操作与嵌入机制

顾言
顾言
发布时间:2026-10-13 | 5人浏览过
原创

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")
}
以上就是关于Go语言Struct结构体的详细内容,更多关于Go语言结构体使用的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表