首页 >后端开发 >Golang >Go 指针:'&”(地址)和'*”(取消引用)之间有什么区别?

Go 指针:'&”(地址)和'*”(取消引用)之间有什么区别?

Susan Sarandon
Susan Sarandon原创
2024-12-02 18:59:09253浏览

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

& 和 * 指针

在 Go 中,将变量作为函数参数传递有时会引发编译器错误,可以使用指针来解决。然而,& 和 * 指针之间的区别常常会导致混乱。本文旨在阐明两种指针类型的差异和使用场景。

解决错误

在您的示例中,错误可能是由于预期参数类型与实际参数类型不匹配造成的变量通过。 Decode 函数需要一个指向 User 结构的地址或指针,但您直接传递该值。要解决这个问题,您可以使用 & 运算符来获取 User 变量的地址:

if err := decoder.Decode(&u); err != nil {
    http.Error(rw, "could not decode request", http.StatusBadRequest)
    return
}

理解指针

指针是保存其他变量地址的变量。 & 运算符返回变量的地址,而 * 运算符允许我们访问该地址处的值。

在上面的示例中,&u 给出 User 结构体的地址,然后将其传递给解码需要指针的函数。

但是,如果您使用以下方法创建了 User 实例:

u := new(User)

那么您已经是一个指针,并且 & 运算符不是必需的。您还可以使用显式创建指针:

var u *User

& 和 * 之间的区别

& 和 * 之间的主要区别是 * 表示重定向到存储在地址中的值,而 & 返回地址

示例:

var y int
var pointerToY *int
var pointerToPointerToInt **int

y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY

现在:

  • y 的值为 10。
  • *pointerToY重定向到 y 并打印其值10.
  • &y返回y的地址。
  • &pointerToY返回pointerToY的地址。
  • &pointerToPointerToInt返回pointerToPointerToInt的地址。
  • **pointerToPointerToInt打印值 10,因为它重定向两次以获取to y.

使用场景

&(运算符地址):

  • 传递变量的地址到一个函数。
  • 在分配给一个函数之前获取地址指针。
  • 比较两个指针。

示例:

func swap(x, y *int) {
    *x, *y = *y, *x
}

*(解引用运算符):

  • 访问存储在地址。
  • 为指针赋值。
  • 比较两个指针。

示例:

var p *int

*p = 10

结论:

理解 & 和 指针对于 Go 中有效的变量处理和解决编译器错误至关重要。关键区别在于 的“重定向”行为,而 & 返回变量的实际地址。通过仔细考虑预期的使用场景,您可以有效地利用 Go 代码中的指针来实现最佳性能和正确性。

以上是Go 指针:'&”(地址)和'*”(取消引用)之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn