2013-12-12 31 views
2

我期望这个代码,以产生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 

我误解了指针的基本原理,或者在处理切片时有所不同?

回答

5

的问题是,你正在做一个指针的地址:

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

同意。这里是我将在我的答案中包含的操场链接:http://play.golang.org/p/rs57O_9E1u – lnmx