在教程中写道:
类型
*T
是指向T
值的指针。&
运算符生成指向其操作数的指针。
我正在尝试使用Go中的指针,并编写了以下内容:
example := 42
p:=&example
fmt.Println(reflect.TypeOf(&p)) // **int
fmt.Println(reflect.TypeOf(*p)) // int
如果我理解正确,&p
是指向一个int值的指针的指针。
在Go语言中,**Type有什么用途?
在这里,我们使用指针链的概念来进行演示:
package main
import "fmt"
func main() {
i := 42
fmt.Printf("i: %[1]T %[1]d\n", i)
p := &i
fmt.Printf("p: %[1]T %[1]p\n", p)
j := *p
fmt.Printf("j: %[1]T %[1]d\n", j)
q := &p
fmt.Printf("q: %[1]T %[1]p\n", q)
k := **q
fmt.Printf("k: %[1]T %[1]d\n", k)
}
Playground: https://play.golang.org/p/WL2M1jp1T3
输出:
i: int 42
p: *int 0x10410020
j: int 42
q: **int 0x1040c130
k: int 42
是的,你理解得很正确。
至于“有什么用”,它与其他地方一样:在以下情况下使用指针:
某个变量必须在其他代码中(通常是另一个函数)更改, 因此将指向该变量所占用内存的指针传递给该函数,以便该函数能够通过该地址更新该内存。
一个值太大,无法通过复制来快速传递。
对于Go而言,指向指针的指针有点病态,但在第一种情况下可以使用:当您希望某个函数更改由您的代码控制的指针变量的值时。
*T
一样,您可以通过将&p
传递给一个函数来更改p
的值,该函数然后更改指向的值。 - mkopriva