指针是存储变量内存地址的变量,通过&取地址、声明和解引用;Go中指针用于函数传参修改原值、节省大对象传递开销及实现数据共享;new(T)为类型T分配零值内存并返回T指针,仅用于基础类型或结构体;make仅用于slice、map、channel的初始化,不返回指针;nil指针未指向有效内存,解引用会引发panic,使用前需判空。

在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类型的参数,函数体内通过解引用修改了原始变量。
Go提供了new(T)来为类型T分配内存并返回指向它的指针:
ptr := new(int)
*ptr = 42
fmt.Println(*ptr) // 输出 42
new适用于基础类型或结构体,它分配零值内存并返回指针。make则不同,它只用于slice、map和channel,并不返回指针,而是初始化这些引用类型使其可用。
注意:make不返回地址,而new返回*T。
刚声明但未赋值的指针是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那样做地址加减,这减少了出错可能。理解指针的核心是搞清“地址”和“值”的区别,以及如何通过&取地址、
以上就是如何在Golang中理解指针与内存地址的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号