Ich habe zwei Funktionen in Go, die fast das gleiche tun. Sie nehmen eine Scheibe von Strukturen, die ein "ID" -Feld hat, und sortieren sie in eine Karte, die von diesem Feld indiziert wird. Sie hängen es dann an ein Feld einer anderen Struktur an, die ebenfalls durch die ID identifiziert wird.Zwei ähnliche Funktionen generisch
Die zwei Funktionen tun das gleiche, aber an zwei verschiedene Felder in der Struktur anhängen. Ich möchte die Methoden generisch machen, aber ich bin nicht sicher, wie es geht. Ich würde erwarten, dass es mit einem Zeiger gemacht werden könnte, aber ich bin mir nicht sicher, wie.
Funktion 1:
func addPremiereDatesToMovies(m []Movie, pd []PremiereDate) ([]Movie, error) {
pds := make(map[int64][]PremiereDate)
// Key-index the premiere-date array for easier lookup
for _, value := range pd {
pds[value.Id] = append(pds[value.Id], value)
}
// Append premiere dates to movies where such exist
for key, value := range m {
if _, ok := pds[value.Id]; !ok { // <-- How to make this generic?
m[key].PremiereDates = []PremiereDate{}
continue
}
m[key].PremiereDates = pds[value.Id]
}
return m, nil
}
Funktion 2:
func addGenresToMovies(m []Movie, g []Genre) ([]Movie, error) {
gs := make(map[int64][]Genre)
// Key-index the genre array for easier lookup
for _, value := range g {
gs[value.Id] = append(gs[value.Id], value)
}
// Append genres to movies where such exist
for key, value := range m {
if _, ok := gs[value.Id]; !ok { // <-- How to make this generic?
m[key].Genres = []Genre{}
continue
}
m[key].Genres = gs[value.Id]
}
return m, nil
}
Wie es scheint, sie sehen ziemlich ähnlich. Ich bin in der Lage, es zu tun, außer ich kann nicht herausfinden, wie man das Feld "value.Id" in Zeile 11 generisch beschreibt.
Vielen Dank.
Ich denke, für den Code, den Sie in Ihrer Frage vorgestellt haben, gibt es wenig Vorteile einer generischen Funktion. zwei getrennte Funktionen sind vollkommen in Ordnung, lesbar und typsicher. Sie können ein paar Zeilen Code speichern, indem Sie keine leere Scheibe für fehlende IDs erstellen (verwenden Sie stattdessen einfach nil). – kostya
Ich habe versucht, eine Lösung zu erstellen, aber es scheint, dass Ihr Code fließt. Sie erstellen 'pds'- und' gds'-Maps, die von PremierDate und Genre 'Id' gekeyed werden, aber dann suchen Sie nach der Film-ID:' gs [value.Id] '. Macht für mich keinen Sinn. Beachten Sie auch anstelle von 'm [key] .Genres =' Sie können 'value.Genres =' –