2015-02-18 2 views
1

Вот код:Как я могу получить указатель STRUCT от среза в golang

package main 

import (
    "fmt" 
) 

type demo struct { 
    name string 
} 

func main() { 
    demo_slice := make([]demo, 3) 
    demo_slice[0] = demo{"str1"} 
    demo_slice[1] = demo{"str2"} 
    demo_slice[2] = demo{"str3"} 

    point_demo_slice := make([]*demo, 3) 
    for index, value := range demo_slice { 
      fmt.Printf("\n%v==++++++++++++++%p\n", value, &value) 
      point_demo_slice[index] = &value 
    } 
} 

Результат:

{str1}==++++++++++++++0x20818a220 

{str2}==++++++++++++++0x20818a220 

{str3}==++++++++++++++0x20818a220 

0x20818a220 является значение указателя последнего элемента.

Почему все значения указателя одинаковы?

Как я могу получить эти правильные значения указателя?

ответ

5

Вы не обращаясь к элементам среза, но локальной переменной value:

fmt.Printf("\n%v==++++++++++++++%p\n", value, &value) 

Следовательно, все значения указателя будет таким же (адрес локальной переменной value). Если вы хотите, указатели на элементы среза, а затем взять адрес соответствующего элемента:

fmt.Printf("\n%v==++++++++++++++%p\n", demo_slice[index], &demo_slice[index]) 

Это произведет следующий вывод, что все указатели отличаются:

{str1}==++++++++++++++0x104342e0 

{str2}==++++++++++++++0x104342e8 

{str3}==++++++++++++++0x104342f0 
+0

Я полностью понимаю. большое спасибо – soapbar