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)本身是引用类型,无需显式使用指针来修改内容。

回到顶部