深入理解Go语言中的*和&操作符

在Go语言中,和&操作符的具体区别和使用场景是什么?什么时候该用指针(),什么时候该取地址(&)?能否结合代码示例说明它们在函数传参、结构体操作中的实际应用?另外,误用这两个操作符会导致哪些常见问题?

2 回复

Go语言中,& 是取地址符,用于获取变量的内存地址;* 是解引用符,用于访问指针指向的值。例如,var a int = 10p := &ap 是指向 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
    

关键点:

  1. 指针类型:声明指针时使用 *,如 var p *int
  2. 默认值:指针的默认值为 nil
  3. 用途
    • 避免大结构体复制,提升性能。
    • 允许函数修改外部变量(引用传递)。

示例:函数中修改外部变量

func modifyValue(ptr *int) {
    *ptr = 999
}

func main() {
    x := 42
    modifyValue(&x)
    fmt.Println(x) // 输出 999
}

注意事项:

  • 解引用 nil 指针会导致运行时恐慌(panic)。
  • 指针操作需谨慎,避免悬空指针或内存泄漏。

通过掌握 *&,可以更高效地管理内存,编写高性能的Go程序。

回到顶部