这是指针的指针
package main
import "fmt"
func main() {
var num int
fmt.Println(&num) // 0x...0
makePointer(&num)
}
func makePointer(firstPointer *int) {
fmt.Println(firstPointer) // 0x...0
fmt.Println(&firstPointer) // 0x...1
makePointerToAPointer(&firstPointer)
}
func makePointerToAPointer(secondPointer **int) {
fmt.Println(secondPointer) // 0x...1
fmt.Println(&secondPointer) // 0x...2
}
Run Code Online (Sandbox Code Playgroud)
你什么时候才能使用它?你可以正确地提出一些更容易做其他事情的事情,但这不是我所要求的.我真的想知道你会在哪个生产中使用它?
指针的指针有时在函数参数中有意义; 不太**int可能,但指向指向某个结构的指针,您希望函数能够更改变量指向的对象,而不仅仅是更改结构的内容.例如,Go编译器的内部有一些函数采用a **Node(参见cmd/compile/internal/gc/racewalk.go).
我自己也写过一些函数,它们需要一个**html.Node; 他们在HTML页面上运行,可能已经或可能没有被解析成*html.Nodes 树,他们可能需要也可能不需要解析页面 - 但如果他们这样做,我想保留解析后的树,这样我就不会不得不再次解析它.这些是在github.com/andybalholm/redwood/prune.go.
它们在没有多个返回值的语言中更常见,因为它们可以用作返回作为指针的附加值的方法.许多Objective-C方法都将a NSError**作为最后一个参数,以便它们可以选择返回一个NSError*.