Pointers 理解围棋指针

Pointers 理解围棋指针,pointers,go,Pointers,Go,我希望此代码生成4个地址,每个节点2个,因此,有2个相同的地址,然后是另一组2个相同的地址: type node struct { identifier string parent *node children []*node root int } func visitNodes(root *node) { for i := 0; i < len(root.children); i++ { fmt.Pr

我希望此代码生成4个地址,每个节点2个,因此,有2个相同的地址,然后是另一组2个相同的地址:

type node struct {
    identifier string
    parent     *node
    children   []*node
    root       int
}

func visitNodes(root *node) {   
    for i := 0; i < len(root.children); i++ {
        fmt.Printf("Visiting node %s\n", &root.children[i])
        printNodeAddress(root.children[i])
    }
}

func printNodeAddress(node *node) {
    fmt.Println(&node)
}


func main() {
    root := new(node)
    node1 := new(node)
    node2 := new(node)

    root.children = append(root.children, node1)
    root.children = append(root.children, node2)

    visitNodes(root)
}
我希望它能产生这样的效果:

Visiting node  %!s(**main.node=0x10500170)
0x10500170
Visiting node  %!s(**main.node=0x10500174)
0x10500174

我是否误解了go指针的基本原理,或者在处理切片时有什么不同?

问题在于,您正在获取指针的地址:

func printNodeAddress(node *node) {
    fmt.Println(&node) // there's now a second layer of indirection in here. a **node
}
实际上,您试图看到的是指针的内存地址。您应该将
Printf
更改为:

fmt.Printf("Visiting node %p\n", root.children[i])
而您的
printNodeAddress
函数将:

fmt.Printf("%p\n", node)
然后你会得到这个:

Visiting node 0x1052f2c0
0x1052f2c0
Visiting node 0x1052f2e0
0x1052f2e0

同意。以下是我将在回答中包含的游乐场链接:
Visiting node 0x1052f2c0
0x1052f2c0
Visiting node 0x1052f2e0
0x1052f2e0