php-Editor Strawberry stellt Ihnen heute eine häufig verwendete Technik vor – Go. Dies ist eine idiomatische Art, eine Struktur einer anderen zuzuordnen. Beim Programmieren müssen wir häufig eine Datenstruktur in eine andere Datenstruktur konvertieren, um unterschiedliche Anforderungen zu erfüllen. Go bietet eine übersichtliche und flexible Möglichkeit, dieses Ziel zu erreichen. Ganz gleich, ob wir Datenbankabfrageergebnisse, API-Antworten oder andere Datentransformationsszenarien verarbeiten, Go kann uns dabei helfen, die Arbeit an der Strukturzuordnung problemlos abzuschließen. Lassen Sie uns als Nächstes mehr über die spezifische Verwendung von Go! erfahren.
Ich verwende eine Go-Sprachbibliothek eines Drittanbieters, um die LDAP-Datenbank des Benutzers abzufragen. Die Bibliothek gibt ein Ergebnisbenutzersegment des Suchergebnisses zurück, das ich meiner eigenen Benutzerstruktur zuordnen muss. Diese beiden Strukturen haben unterschiedliche Feldnamen, ich benötige nur bestimmte Felder von resultuser. Gibt es eine idiomatischere Möglichkeit, eine Struktur in eine andere umzuwandeln?
Ich habe unten eine Demo erstellt (auch auf dem Go-Spielplatz verlinkt). Vielen Dank im Voraus für jeden Rat, den Sie für diesen Go-Neuling haben!
package main import "fmt" type ( User struct { id int32 firstName string } ResultUser struct { uid int32 fname string } SearchResults []ResultUser ) func main() { results := getSearchResults() users := mapResultsToUsers(results) // <-- This is the problem fmt.Println("User struct:", users[0].id, users[0].firstName) fmt.Println("User struct:", users[1].id, users[1].firstName) } // Simulates a query to a data with a library func getSearchResults() (results SearchResults) { return append(results, ResultUser{1, "John"}, ResultUser{2, "Jane"}) } // Seems like a code smell to have to do this // Is there a more idiomatic way to do this? func mapResultsToUsers(results SearchResults) (users []User) { for _, result := range results { users = append(users, User{result.uid, result.fname}) } return users }
Ich habe Strukturfeld-Tags gesehen, bin mir aber nicht sicher, ob es einen besseren Weg gibt.
Ich denke, was Sie haben, ist so ziemlich die beste Lösung, obwohl ich die Zuordnung in eine dedizierte Funktion verschieben würde, wie zum Beispiel:
func fromresultuser(r *resultuser) *user { return &user{ id: r.uid, firstname: r.fname, } }
Dann wird mapresultstousers
zu:
func mapresultstousers(results searchresults) (users []*user) { for _, result := range results { users = append(users, fromresultuser(result)) } return users }
Ich habe Strukturfeld-Tags gesehen, bin mir aber nicht sicher, ob es einen besseren Weg gibt.
Sie können etwas kombinieren, sodass Ihre user
-Struktur wie folgt mit Anmerkungen versehen werden kann:
User struct { id int32 `mappedFrom:"uid"` firstName string `mappedFrom:"fname"` }
Aber die Umsetzung erfordert mehr Methoden als das hier vorgestellte fromresultuser
复杂得多,并且需要熟悉 reflect
Paket. Ich denke, wie einer meiner Kollegen gerne sagt: „Der Saft ist den Druck nicht wert.“
Das obige ist der detaillierte Inhalt vonGo – Idiomatische Art, eine Struktur einer anderen zuzuordnen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!