深入理解Go语言中的*和&操作符
在Go语言中,和&操作符的具体区别和使用场景是什么?什么时候该用指针(),什么时候该取地址(&)?能否结合代码示例说明它们在函数传参、结构体操作中的实际应用?另外,误用这两个操作符会导致哪些常见问题?
2 回复
Go语言中,& 是取地址符,用于获取变量的内存地址;* 是解引用符,用于访问指针指向的值。例如,var a int = 10,p := &a 中 p 是指向 a 的指针,*p 可获取 a 的值。
在Go语言中,*和&操作符用于指针操作,是理解内存管理和高效编程的关键。
1. & 操作符(取地址操作符)
- 作用:获取变量的内存地址。
- 示例:
var x int = 42 ptr := &x // ptr 是指向 x 的指针,类型为 *int fmt.Println(ptr) // 输出 x 的内存地址,如 0xc000018030
2. * 操作符(解引用操作符)
- 作用:通过指针访问或修改其指向的值。
- 示例:
var x int = 42 ptr := &x fmt.Println(*ptr) // 输出 42 *ptr = 100 // 通过指针修改 x 的值 fmt.Println(x) // 输出 100
关键点:
- 指针类型:声明指针时使用
*,如var p *int。 - 默认值:指针的默认值为
nil。 - 用途:
- 避免大结构体复制,提升性能。
- 允许函数修改外部变量(引用传递)。
示例:函数中修改外部变量
func modifyValue(ptr *int) {
*ptr = 999
}
func main() {
x := 42
modifyValue(&x)
fmt.Println(x) // 输出 999
}
注意事项:
- 解引用
nil指针会导致运行时恐慌(panic)。 - 指针操作需谨慎,避免悬空指针或内存泄漏。
通过掌握 * 和 &,可以更高效地管理内存,编写高性能的Go程序。

