在 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
现在:
&(运算符地址):
示例:
func swap(x, y *int) { *x, *y = *y, *x }
*(解引用运算符):
示例:
var p *int *p = 10
结论:
理解 & 和 指针对于 Go 中有效的变量处理和解决编译器错误至关重要。关键区别在于 的“重定向”行为,而 & 返回变量的实际地址。通过仔细考虑预期的使用场景,您可以有效地利用 Go 代码中的指针来实现最佳性能和正确性。
以上是Go 指针:'&”(地址)和'*”(取消引用)之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!