Go语言基础:指针与结构体详解

何川
何川
发布时间:2026-10-15 | 3人浏览过
原创

Go语言作为强类型静态语言,其指针与结构体是构建高效程序的核心基石。本文聚焦于指针的取值与修改逻辑,以及结构体的定义语法和多维初始化技巧,通过清晰的代码示例与步骤说明,帮助开发者快速理解Go的基础数据结构机制。

指针定义与创建

在 Go 语言中,指针本质上是一个存储内存地址的变量。每个基本数据类型都有对应的指针类型,例如 int 对应 *int,string 对应 *string。正确使用指针可以优化内存使用并提高程序执行效率。

第1步:声明指向特定变量的指针

利用取地址符号 & 获取变量的内存地址,并将其赋值给指针变量。这要求指针的类型必须与目标变量的类型严格匹配,否则编译器将报错。

import (
	"fmt"
)

func main() {
	var num int = 666
	var numPtr *int = &num
	fmt.Println(numPtr)  // 输出 num 的内存地址,如 0xc00001c098
	fmt.Println(&numPtr) // 输出指针变量自身的内存地址
}

第2步:使用 new 函数自动分配内存

new(T) 函数用于为指定类型 T 分配零值内存,并返回指向该内存的指针。此方法无需预先存在变量,适合初始化为默认值的场景。

import (
	"fmt"
)

func main() {
	numPtr := new(int)
	fmt.Println(numPtr)  // 分配的内存地址
	fmt.Println(*numPtr) // 读取到的零值:0
}

指针的值获取与修改

通过解引用操作符 *,可以直接访问或修改指针所指向内存区域中的数据。这是处理大型数据结构时避免拷贝开销的关键手段。

第3步:通过指针读取与修改变量

对指针变量执行 * 操作即代表其指向的目标值。赋值操作同样适用,直接修改目标内存即可同步更新原变量。

import (
	"fmt"
)

func main() {
	var num int = 666
	var numPtr *int = &num

	// 读取目标值
	fmt.Println(*numPtr) // 输出 666

	// 修改目标值
	*numPtr = 555
	fmt.Println(num) // 输出 555,原变量同步变更
}

结构体的定义与规则

结构体(Struct)由零个或多个字段组成,用于表示具有不同属性的复杂对象。字段命名遵循可见性规则:首字母大写表示包外可访问(公开),首字母小写表示仅限包内访问(私有)。

第4步:定义标准与嵌套结构体

使用 type Name struct { ... } 语法定义类型。除了常规字段,还支持嵌入其他结构体作为字段,形成层级关系。

// 定义 Person 结构体
type Person struct {
	Name   string
	Age    int
	Sex    string
	idNumber string // 私有字段,包外不可见
}

// 定义 Phone 结构体,包含嵌入的 Person
type Phone struct {
	Brand string
	Owner Person // Owner 属性为 Person 类型
}

结构体的多种创建方式

初始化结构体主要有四种途径,根据是否需要顺序依赖、是否涉及指针操作等场景选择合适的语法。

第5步:声明与隐式初始化

直接声明结构体变量时,所有字段自动初始化为对应类型的零值。后续可通过 变量.字段名 逐一赋值。

type Person struct {
	Name string
	Age  int
	Sex  string
	idNumber string
}

func main() {
	var person Person
	// 字段值默认为 "", 0, "", ""
	person.Name = "chenmingyong"
	fmt.Println(person.Name) // 输出 chenmingyong
}

第6步:显式初始化(按顺序赋值)

使用字面量列表按字段声明顺序提供值。这种方式紧凑但不推荐,因为一旦结构体添加新字段或修改顺序,极易引发错误。

import "fmt"

type Person struct {
	Name   string
	Age    int
	Sex    string
	idNumber string
}

func main() {
	person := Person{
		"chenmingyong",
		18,
		"男",
		"xxxxxxxxx",
	}
	fmt.Println(person) // {chenmingyong 18 男 xxxxxxxxx}
}

第7步:键值对形式显式初始化(推荐)

采用 字段名: 值 的方式初始化,摆脱了字段顺序的束缚,增强了代码的可读性与维护性。

import "fmt"

type Person struct {
	Name   string
	Age    int
	Sex    string
	idNumber string
}

func main() {
	person := Person{
		Sex:      "男",
		Age:      18,
		Name:     "chenmingyong",
		idNumber: "xxxxxxxxx",
	}
	fmt.Println(person) // 字段顺序不影响结果
}

第8步:使用 new 创建结构体指针

通过 new(Person) 获取结构体指针后,可以直接通过点号 . 访问内部字段。Go 底层会自动处理解引用过程,简化了指针操作的语法负担。

type Person struct {
	Name   string
	Age    int
	Sex    string
	idNumber string
}

func main() {
	person := new(Person)
	// 底层自动转换为 (*person).Name = "..."
	person.Age = 18
	fmt.Println(person.Age) // 输出 18
}

小结

掌握指针的地址关联特性与解引用机制,配合结构体的多态初始化策略,能够有效提升 Go 开发中数据处理的安全性与灵活性。在实际应用中,推荐使用键值对方式初始化结构体,并利用指针减少不必要的内存拷贝。

以上就是Go语言中的指针和结构体的详细内容,更多关于Go语言指针 结构体资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表