Heim  >  Artikel  >  Backend-Entwicklung  >  Go – Idiomatische Art, eine Struktur einer anderen zuzuordnen

Go – Idiomatische Art, eine Struktur einer anderen zuzuordnen

WBOY
WBOYnach vorne
2024-02-11 20:03:081054Durchsuche

Go - 将一个结构映射到另一个结构的惯用方式

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.

Frageninhalt

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.

Workaround

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen