2016-11-03 6 views
2

Dies ist eine kleine Wendung bei ähnlichen Posts.Initialisieren einer Struktur in einer Struktur

Ich habe ein Paket data genannt, die Folgendes hat:

type CityCoords struct { 
    Name string 
    Lat float64 
    Long float64 
} 

type Country struct { 
     Name string 
     Capitol *CityCoords 
} 

In meiner Hauptfunktion ich versuche, ein Land wie so initialisiert:

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

} 

Wenn ich mein Projekt bauen, bekomme ich diese Fehler, der mit dem "Namen" zugeordnet wurde, wie oben angegeben:

missing type in composite literal 

Wie behebe ich diesen Fehler?

Antwort

3

Soweit bekannt, bedeutet *, dass ein Objektzeiger erwartet wird. So könnten Sie es zuerst mit & initiieren;

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) 
} 

Oder Sie können einen eleganteren Weg bevorzugen;

// 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

Danke, K-Gun. Warum geben Sie bei NewCountry und NewCountryCapital Tipps für Country und CountryCapital? –

+0

Es gibt keinen bestimmten Grund, dies zu tun, Sie können diese Funktionen wie gewünscht benennen. Aber ich denke, in der Go-Welt ist dies eine weit verbreitete Konvention, nur weil es kein 'neues' Schlüsselwort gibt, um ein Objekt wie in anderen Sprachen zu initialisieren. Also, [Gophers] (https://blog.golang.org/gopher) bevorzugen diesen Weg, indem sie Funktionen mit 'New' Präfix benennen und soweit ich sehe, macht sie ihren Code lesbarer, auch semantisch. –

Verwandte Themen