登录
首页 >  Golang >  Go教程

Golang指针与内存地址详解

时间:2026-03-04 22:06:40 248浏览 收藏

本文深入浅出地解析了Golang中指针的本质与实践:指针是存储变量内存地址的变量,通过&获取地址、*声明和解引用,是Go实现函数内修改原值、高效传递大对象及共享数据的关键机制;文章厘清了new(为任意类型分配零值内存并返回指针)与make(仅初始化slice/map/channel且不返回指针)的根本区别,并强调nil指针解引用会导致panic,务必判空——在兼顾内存可控性与语言安全性的设计哲学下,掌握“变量—地址—指向”三者关系,才是真正驾驭Go指针的核心。

如何在Golang中理解指针与内存地址

在Golang中,指针是理解内存管理的关键。它不像一些高级语言完全隐藏内存细节,Go允许你直接操作内存地址,但又比C/C++更安全。要真正掌握Go中的指针,得从“变量、内存地址和指向关系”这三个基本概念入手。

什么是指针?

指针是一个变量,它的值是另一个变量的内存地址。用&可以获取一个变量的地址,用*可以声明一个指针类型,也可以通过*解引用访问指针指向的值。

例如:

x := 10
p := &x // p 是一个 *int 类型的指针,保存 x 的地址
fmt.Println(p) // 输出类似 0xc00001a078(x 的地址)
fmt.Println(*p) // 输出 10,*p 表示取 p 指向的值

这里p是指针变量,它存储的是x在内存中的位置。*p就是通过这个地址找到实际的值。

指针的常见用途

Go中使用指针不只是为了炫技,它有几个实实在在的作用:

  • 函数传参时修改原值:Go默认是值传递,如果想在函数内改变外部变量,就得传指针。
  • 节省内存开销:传递大结构体时,传指针比复制整个结构体更高效。
  • 实现数据共享:多个地方可以通过同一个指针操作同一块内存。

示例:通过指针修改值

func increment(p *int) {
  *p = *p + 1
}

num := 5
increment(&num)
fmt.Println(num) // 输出 6

这里increment接收一个*int类型的参数,函数体内通过解引用修改了原始变量。

new 和 make 的区别

Go提供了new(T)来为类型T分配内存并返回指向它的指针:

ptr := new(int)
*ptr = 42
fmt.Println(*ptr) // 输出 42

new适用于基础类型或结构体,它分配零值内存并返回指针。make则不同,它只用于slice、map和channel,并不返回指针,而是初始化这些引用类型使其可用。

注意:make不返回地址,而new返回*T

nil 指针与安全访问

刚声明但未赋值的指针是nil,表示它不指向任何有效内存。

var p *int
fmt.Println(p == nil) // true

对nil指针解引用会引发panic:

var p *int
fmt.Println(*p) // panic: invalid memory address or nil pointer dereference

所以使用指针前最好判断是否为nil,尤其是在函数接收指针参数时。

基本上就这些。Go的指针设计简洁,没有指针运算,不能像C那样做地址加减,这减少了出错可能。理解指针的核心是搞清“地址”和“值”的区别,以及如何通过&取地址、

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>