亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

理解 Go 指針

理解 Go 指針

Go
幕布斯6054654 2021-07-07 13:00:50
我希望這段代碼產生 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


查看完整回答
反對 回復 2021-07-12
  • 1 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號