指针指针(例如**int)有什么用例?

J. *_*Eng 1 pointers go

这是指针的指针

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)

你什么时候才能使用它?你可以正确地提出一些更容易做其他事情的事情,但这不是我所要求的.我真的想知道你会在哪个生产中使用它?

and*_*olm 5

指针的指针有时在函数参数中有意义; 不太**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*.