我希望这段代码产生 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)0x10500180Visiting node %!s(**main.node=0x10500174)0x10500190虽然我希望它产生这样的东西:Visiting node %!s(**main.node=0x10500170)0x10500170Visiting node %!s(**main.node=0x10500174)0x10500174我是否误解了 go 指针的基本原理,或者在处理切片时有所不同?
1 回答
跃然一笑
TA贡献1826条经验 获得超6个赞
问题是您正在获取指针的地址:
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
- 1 回答
- 0 关注
- 204 浏览
添加回答
举报
0/150
提交
取消