&
和 *
在 Go 语言中确实常常一起使用,并且它们的作用是互补的。虽然它们在用法上是相关的,但它们的功能是不同的:
-
&
符号:用于获取变量的地址,也就是指针。你可以把它理解为“取地址”操作。例如:
p := &x // 获取变量 x 的地址,并赋值给指针 p
-
*
符号:有两个主要作用:-
在变量前使用时(解引用):获取指针指向的值。你可以把它理解为“取值”操作。
例如:
y := *p // 获取指针 p 指向的变量的值,并赋值给 y
-
在类型前使用时:表示声明一个指向该类型的指针。
例如:
var p *int // 声明一个指向 int 类型的指针 p
-
例子结合起来看
package main
import "fmt"
func main() {
x := 42 // 普通变量 x
p := &x // 使用 & 符号获取 x 的地址(指针)
fmt.Println(p) // 打印 p,即 x 的地址
y := *p // 使用 * 符号解引用 p,获取指针 p 指向的值
fmt.Println(y) // 打印 y,即 x 的值(42)
*p = 21 // 修改指针 p 指向的值,x 的值也会被修改
fmt.Println(x) // 打印 x,结果是 21
}
解释
p := &x
:这里&x
是取x
的地址,然后将这个地址赋值给指针p
。y := *p
:这里*p
是解引用p
,获取p
指向的x
的值,然后将这个值赋给y
。*p = 21
:这里*p
是解引用p
,然后将新值21
赋给p
指向的变量,也就是x
。
总结:&
和 *
常常配合使用。&
是用来获取地址的,*
是用来通过地址获取或设置值的。它们的确很像,但实际功能是互补的,配合使用可以在 Go 中灵活地处理指针和内存。