gpt4 book ai didi

pointers - 请解释 &, 和 * 指针

转载 作者:IT老高 更新时间:2023-10-28 13:02:53 28 4
gpt4 key购买 nike

当我尝试在 Go 函数中将变量作为参数传递时,编译器会抛出多个错误。我有时可以通过在变量前面使用指针来调试它。 & 和 * 指针似乎都可以清除错误。不过,我想了解原因。我想知道 & 和 * 之间的区别是什么,以及何时应该使用它们。谢谢!

func (ctx *NewContext) SendNotification(rw http.ResponseWriter, req *http.Request, p httprouter.Params) {

decoder := json.NewDecoder(req.Body)

var u User

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

最佳答案

在上面的示例中,您将 u 定义为 User 类型,但不是指向 User 的指针。所以你需要 &u 因为 json 包中的 Decode 函数需要一个地址或指针。

如果您像这样创建 User 的实例: u := new(User) 它将是一个指针,因为 new 函数返回一个指针。您还可以像这样创建指向用户的指针:var u *User.如果您执行其中任何一项,则必须在对 Decode 的调用中取出 & 才能使其工作。

指针基本上是保存地址的变量。当您将 & 放在变量前面时,它会返回地址。 * 可以读作“重定向的”。因此,当您创建这样的指针时:

var x *int

这可以理解为 x 将重定向到一个 int。当你给 x 赋值时,你会给它一个这样的地址:y := 10x = &y

其中 y 是一些整数。所以如果你要打印出 x,你会得到 y 的地址,但是如果你打印出 *x,你会重定向到 x 指向的 y 的值,即 10。如果你要打印出 &x,你将获得指针 x 本身的地址。

如果您尝试打印出 *y,它只是一个 int,而不是指针,它会引发错误,因为您将使用一些不是重定向到的地址的值进行重定向。

运行以下代码以获得一些指针的乐趣:

package main

import "fmt"

func main() {
var y int
var pointerToY *int
var pointerToPointerToInt **int

y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY

fmt.Println("y: ", y)
fmt.Println("pointerToY: ", pointerToY)
fmt.Println("pointerToPointerToInt: ", pointerToPointerToInt)

fmt.Println("&y: ", &y) // address of y
fmt.Println("&pointerToY: ", &pointerToY)// address of pointerToY
fmt.Println("&pointerToPointerToInt: ", &pointerToPointerToInt) // address of pointerToPointerToInt

// fmt.Println(*y) throws an error because
// you can't redirect without an address..
// y only has int value of 10
fmt.Println("*pointerToY: ", *pointerToY) // gives the value of y
fmt.Println("*pointerToPointerToInt: ", *pointerToPointerToInt) // gives the value of pointerToY which is the address of y

fmt.Println("**pointerToPointerToInt: ", **pointerToPointerToInt) // this gives 10, because we are redirecting twice to get y

if pointerToY == *pointerToPointerToInt {
fmt.Println("'pointerToY == *pointerToPointerToInt' are the same!")
}

if pointerToY == &y {
fmt.Println("'pointerToY == &y' are the same!")
}

if &pointerToY == pointerToPointerToInt {
fmt.Println("'&pointerToY == pointerToPointerToInt' are the same!")
}

if y == **pointerToPointerToInt {
fmt.Println("'y == **pointerToPointerToInt' are the same!")
}

if pointerToY == *pointerToPointerToInt {
fmt.Println("'pointerToY == *pointerToPointerToInt' are the same!")
}

}

希望这会有所帮助!

关于pointers - 请解释 &, 和 * 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32877525/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com