理解 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.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 指针的基本原理,或者在处理切片时有所不同?


幕布斯6054654
浏览 205回答 1
1回答

跃然一笑

问题是您正在获取指针的地址:func printNodeAddress(node *node) {&nbsp; &nbsp; 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 0x1052f2c00x1052f2c0Visiting node 0x1052f2e00x1052f2e0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go