我希望这段代码产生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)
}
Run Code Online (Sandbox Code Playgroud)
生产:
Visiting node %!s(**main.node=0x10500170)
0x10500180
Visiting node %!s(**main.node=0x10500174)
0x10500190
Run Code Online (Sandbox Code Playgroud)
虽然我希望它能产生这样的东西:
Visiting node %!s(**main.node=0x10500170)
0x10500170
Visiting node %!s(**main.node=0x10500174)
0x10500174
Run Code Online (Sandbox Code Playgroud)
我是否误解了指针的基本原理,或者在处理切片时有所不同?
问题是你正在获取指针的地址:
func printNodeAddress(node *node) {
fmt.Println(&node) // there's now a second layer of indirection in here. a **node
}
Run Code Online (Sandbox Code Playgroud)
当你真正想要看到的是指针的内存地址时.你应该改变你Printf的想法:
fmt.Printf("Visiting node %p\n", root.children[i])
Run Code Online (Sandbox Code Playgroud)
你的printNodeAddress功能如下:
fmt.Printf("%p\n", node)
Run Code Online (Sandbox Code Playgroud)
然后你会得到这个:
Visiting node 0x1052f2c0
0x1052f2c0
Visiting node 0x1052f2e0
0x1052f2e0
Run Code Online (Sandbox Code Playgroud)