2016-11-03 2 views
2

Это небольшое завихрение на аналогичных сообщениях.Инициализация структуры в структуре

У меня есть пакет под названием data, который имеет следующее:

type CityCoords struct { 
    Name string 
    Lat float64 
    Long float64 
} 

type Country struct { 
     Name string 
     Capitol *CityCoords 
} 

В моей основной функции я пытаюсь инициализировать Страну так:

germany := data.Country { 
    Name: "Germany", 
    Capitol: { 
     Name: "Berlin", //error is on this line 
     Lat: 52.5200, 
     Long: 13.4050, 
    }, 

} 

Когда я строю свой проект, я получаю это ошибка, совпадающая с «именем», указанным выше, как указано выше:

missing type in composite literal 

Как устранить эту ошибку?

ответ

3

Насколько известно, * означает, что ожидается указатель на объект. Итак, вы можете начать его сначала, используя &;

func main() { 
    germany := &data.Country{ 
     Name: "Germany", 
     Capitol: &data.CityCoords{ 
      Name: "Berlin", //error is on this line 
      Lat: 52.5200, 
      Long: 13.4050, 
     }, 
    } 
    fmt.Printf("%#v\n", germany) 
} 

Или вы можете выбрать более элегантный способ;

// data.go 
package data 

type Country struct { 
    Name string 
    Capital *CountryCapital 
} 

type CountryCapital struct { 
    Name string 
    Lat  float64 
    Lon  float64 
} 

func NewCountry(name string, capital *CountryCapital) *Country { 
    // note: all properties must be in the same range 
    return &Country{name, capital} 
} 

func NewCountryCapital(name string, lat, lon float64) *CountryCapital { 
    // note: all properties must be in the same range 
    return &CountryCapital{name, lat, lon} 
} 

// main.go 
func main() { 
    c := data.NewCountry("Germany", data.NewCountryCapital("Berlin", 52.5200, 13.4050)) 
    fmt.Printf("%#v\n", c) 
} 
+0

Спасибо, K-Gun. Почему вы возвращаете указатели на Country и CountryCapital из NewCountry и NewCountryCapital? –

+0

Нет особых причин для этого, вы можете назвать эти функции так, как хотите. Но я думаю, что в мире Go это широко используемое соглашение только из-за отсутствия ключевого слова 'new' для инициализации объекта, как на других языках. Таким образом, [Gophers] (https://blog.golang.org/gopher) предпочитают этот способ, назначая функции с префиксом 'New', и, насколько я вижу, он делает их код более читаемым, а также семантическим. –

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