Я новичок в Go и хочу создать и инициализировать массив структур в go. Мой код такой

type node struct {
name string
children map[string]int
}

cities:= []node{node{}}
for i := 0; i<47 ;i++ {
    cities[i].name=strconv.Itoa(i)
    cities[i].children=make(map[string]int)
}

Я получаю следующую ошибку:

panic: runtime error: index out of range

goroutine 1 [running]:
panic(0xa6800, 0xc42000a080)

Пожалуйста помоги. TIA :)

12
Parag 25 Окт 2016 в 04:12

2 ответа

Лучший ответ

Вы инициализируете города как срез узлов с одним элементом (пустым узлом).

Вы можете инициализировать его фиксированным размером с помощью cities := make([]node,47), или вы можете инициализировать его пустым срезом и append к нему:

cities := []node{}
for i := 0; i<47 ;i++ {
  n := node{name: strconv.Itoa(i), children: map[string]int{}}
  cities = append(cities,n)
}

Я определенно рекомендую прочитать эту статью, если вы немного не уверены в как работают ломтики.

26
captncraig 25 Окт 2016 в 01:58

Это сработало для меня

type node struct {
    name string
    children map[string]int
}

cities:=[]*node{}
city:=new(node)
city.name=strconv.Itoa(0)
city.children=make(map[string]int)
cities=append(cities,city)
for i := 1; i<47 ;i++ {
    city=new(node)
    city.name=strconv.Itoa(i)
    city.children=make(map[string]int)
    cities=append(cities,city)
}
3
Parag 25 Окт 2016 в 01:32