gpt4 book ai didi

pointers - 理解 Go 指针

转载 作者:IT王子 更新时间:2023-10-29 01:34:03 24 4
gpt4 key购买 nike

我希望这段代码产生 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)
0x10500180
Visiting node %!s(**main.node=0x10500174)
0x10500190

虽然我期望它会产生这样的东西:

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

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

最佳答案

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

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

关于pointers - 理解 Go 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20550274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com