Go语言指针使用:什么时候用*什么时候用&?
刚学Go语言,对指针的使用有点困惑。在什么情况下需要给变量加*号,什么时候要用&取地址?比如在函数传参时,什么时候该用指针接收?平时写代码时如何判断该用值类型还是指针类型?希望能结合具体例子说明一下,感谢!
2 回复
*用于声明指针类型或解引用指针(获取指针指向的值)。
&用于取变量地址(生成指针)。
例如:
var a int = 42
var p *int = &a // &取地址
fmt.Println(*p) // *解引用,输出42
简单记:&取址,*取值。
在Go语言中,* 和 & 是用于指针操作的两个关键符号,使用场景如下:
1. &(取地址符)
- 作用:获取变量的内存地址。
- 使用场景:
- 当你想获取某个变量的指针(即内存地址)时使用。
- 例如:将变量的地址传递给函数,以便在函数内部修改该变量的值。
示例:
var num int = 42
ptr := &num // ptr 是指向 num 的指针,类型为 *int
2. *(解引用符)
- 作用:通过指针访问或修改其指向的值。
- 使用场景:
- 当你想读取或修改指针指向的变量值时使用。
- 在函数中通过指针参数修改外部变量。
示例:
var num int = 42
ptr := &num
fmt.Println(*ptr) // 输出 42(读取指针指向的值)
*ptr = 100 // 通过指针修改 num 的值为 100
关键区别总结:
&变量:获取变量的地址,生成指针。*指针:访问指针指向的实际值。
何时使用?
- 需要在函数间共享数据并修改原始数据时,使用指针(通过
&传递地址,函数内用*操作)。 - 避免数据拷贝,提升性能(尤其对于大型结构体)。
完整示例:
func modifyValue(ptr *int) {
*ptr = 10 // 修改指针指向的值
}
func main() {
var value int = 5
modifyValue(&value) // 传递 value 的地址
fmt.Println(value) // 输出 10
}
注意:Go中部分类型(如slice、map、channel)本身是引用类型,无需显式使用指针来修改内容。

