Sie können eine Strukturtyp erstellen den gemeinsamen Teil Ihrer Datenstruktur zu halten, und Sie können neue Typen erstellen diese Einbettung und nur das Hinzufügen der abweichenden neues Feld. So gibt es keinen Code Wiederholung des gemeinsamen Teils der Datenstruktur:
type Response struct {
F1 string
F2 int
}
func main() {
for _, env := range []string{"dev", "prod"} {
if env == "dev" {
type Resp struct {
Response
Key string
}
r := Resp{Response{"f1dev", 1}, "value"}
json.NewEncoder(os.Stdout).Encode(r)
} else {
type Resp struct {
Response
Secret string
}
r := Resp{Response{"f1pro", 2}, "value"}
json.NewEncoder(os.Stdout).Encode(r)
}
}
}
Output (versuchen Sie es auf dem Go Playground):
{"F1":"f1dev","F2":1,"Key":"value"}
{"F1":"f1pro","F2":2,"Secret":"value"}
Beachten Sie, dass Sie auch die gleiche Response
Wert verwenden können, wenn sie sind die gleichen für die 2 Anwendungsfälle:
comResp := Response{"f1value", 1}
if env == "dev" {
type Resp struct {
Response
Key string
}
r := Resp{comResp, "value"}
json.NewEncoder(os.Stdout).Encode(r)
} else {
type Resp struct {
Response
Secret string
}
r := Resp{comResp, "value"}
json.NewEncoder(os.Stdout).Encode(r)
}
Sie anonyme Struktur durch Verwendung und nicht eine lokale Variable (nicht unbedingt mehr r die Erstellung des Codes oben verkürzen eadable):
if env == "dev" {
json.NewEncoder(os.Stdout).Encode(struct {
Response
Key string
}{comResp, "value"})
} else {
json.NewEncoder(os.Stdout).Encode(struct {
Response
Secret string
}{comResp, "value"})
}
gibt es einen besseren Weg? Ich habe innere Strukturen. – majidarif