2013-12-12 3 views
2

Я ожидал этот код для получения 4-адреса, 2 для каждого узла, таким образом, имея 2 одинаковых адресов, а затем еще один набор из 2-х одинаковых адресов:Понимание Go Указатели

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

Смежные вопросы