2016-11-15 4 views
0

Я пытаюсь инициализировать структуры из списка строк, но компилятор бросает следующую ошибку. Я все еще изучаю язык, поэтому извиняюсь за мое невежество, но разрешено ли это с помощью утверждения типа?Инициализировать структуры из списка строк

ERROR: v.UberX undefined (type string has no field method UberX)

type Galaxy struct { 
    UberX  int64 
    UberY  int64 
} 

func main() { 
    galaxies := []string{"andromeda", "milkyway", "maffei"} 
    for _, v := range galaxies { 
     v := &Galaxy{} 
    } 
    for _, v := range galaxies { 
     v.UberX += 1000 
     v.UberY += 750 
    } 
} 

ответ

2

Ваш Galaxy структура даже не сохраняет имя, в вашей попытке не существует какая-либо связь между именами и значениями структуры. Добавьте имя в структуры:

type Galaxy struct { 
    Name string 
    UberX int64 
    UberY int64 
} 

Далее, в первом цикле вы создаете значение *Galaxy, но только хранить его в локальной переменной v которая, кстати Shadows переменную цикла v:

for _, v := range galaxies { 
    v := &Galaxy{} 
} 

Вам нужен кусочек Galaxy или кусочек *Galaxy который вы можете заполнить:

gs := make([]*Galaxy, len(galaxies)) 

Тогда один цикл достаточно перебрать названия галактик и заполнить gs срез:

for i, v := range galaxies { 
    gs[i] = &Galaxy{ 
     Name: v, 
     UberX: 1000, 
     UberY: 750, 
    } 
} 

Проверка результата:

for _, v := range gs { 
    fmt.Printf("%+v\n", v) 
} 

Output (попробовать его на Go Playground):

&{Name:andromeda UberX:1000 UberY:750} 
&{Name:milkyway UberX:1000 UberY:750} 
&{Name:maffei UberX:1000 UberY:750} 

Рекомендуется сначала изучить Golang Tour, чтобы изучить основы.

+0

Без сомнения, у меня есть много чтения. Я надеялся, что смогу попрактиковаться в этом. Мой процесс мышления состоял в том, что поле «имя» было бы ненужным, если бы я мог инициализировать структуру с собственным именем. благодаря –

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