Heim  >  Artikel  >  Backend-Entwicklung  >  Golang: Greifen Sie auf generische Felder vom Typ „beliebig“ zu

Golang: Greifen Sie auf generische Felder vom Typ „beliebig“ zu

WBOY
WBOYnach vorne
2024-02-10 10:39:07884Durchsuche

Golang: Greifen Sie auf generische Felder vom Typ „beliebig“ zu

Golang ist eine statisch typisierte Programmiersprache, die bei der Implementierung von Generika schon immer große Aufmerksamkeit erregt hat. Kürzlich hat das Golang-Team einen großen Durchbruch bei der Gestaltung von Generika erzielt und Entwicklern den Zugriff auf Felder „jeder“ Art von Generika ermöglicht. Diese neue Funktion verleiht Golang mehr Flexibilität und Skalierbarkeit. Als nächstes lassen wir Sie vom PHP-Editor Xigua ausführlich in die Methoden und Anwendungsszenarien des Feldzugriffs auf „beliebige“ Typgenerika in Golang einführen.

Frageninhalt

Ich verwende eine Drittanbieterfunktion mit dem generischen Typ any. Die Funktion gibt ein Objekt des an sie übergebenen Typs zurück, und mein eigener Code arbeitet gegen diese Rückgabe.

Ich versuche, meine eigene generische Funktion zu schreiben, die ein HasID 类型的泛型,然后将其传递给第三方函数。但是,当我尝试访问第三方函数返回值的 ID-Feld akzeptiert, und erhalte eine Fehlermeldung.

Was muss ich tun, um dies korrekt einzugeben?

type HasID struct {
    ID string `json:"id"`
}

func ThirdPartyFunc[T any]() T {
  // do some stuff
  return someThing // of type T
}

func MyFunc[U HasID]() {
  thingWithID := ThirdPartyFunc[U]()
  fmt.Println(thingWithID.ID) // undefined (type U has no field or method ID)
}

Workaround

Ich stimme dem Kommentar von @mkopriva zu, aber ich denke, es könnte daran liegen, dass Sie die Felder in der Einschränkung „nicht“ definieren können, sodass Sie in den Typparametern nicht auf diese Felder zugreifen können.

(Wahrscheinlich in Go 1.19 nicht geändert, haha)

Um es einfach zu halten, machen Sie einfach das, was Sie tun würden:

type HasID struct {
    ID string `json:"id"`
}

func MyFunc[U HasID](hasID U) {
    fmt.Println(hasID.ID) // hasID.ID undefined (type U has no field or method ID)

}

https://www.php.cn/link/bddcda5d65fcfdec9de3838794a77265

Aber wenn Sie es als Schnittstelle definieren, haben Sie Zugriff auf seine Methoden:

type HasID interface {
    ID() string
}

func MyFunc[U HasID](hasID U) {
    fmt.Println(hasID.ID()) // compiles V
}

https://www.php.cn/link/46dfb1fd21d4e16401260f54d2b6a88a

Um mit der Struktur umzugehen, müssen Sie eine Typkonvertierung durchführen:

type HasID struct {
    ID string `json:"id"`
}

func MyFunc[U HasID](hasID U) {
    thingWithID := HasID(hasID)
    fmt.Println(thingWithID.ID)
}

P.S. – Es gibt ein offenes Problem vom 02/2022 – https://github.com/golang/go/issues/51259

P.S. – Oh, ich habe gerade herausgefunden … – Wie greife ich mithilfe von Generika auf Strukturfelder zu (Typ T hat keine Felder oder Methoden)?

Das obige ist der detaillierte Inhalt vonGolang: Greifen Sie auf generische Felder vom Typ „beliebig“ zu. 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