Heim > Backend-Entwicklung > Golang > Greifen Sie auf bestimmte Felder einer generischen Struktur zu, die an eine variadische Funktion übergeben wird

Greifen Sie auf bestimmte Felder einer generischen Struktur zu, die an eine variadische Funktion übergeben wird

WBOY
Freigeben: 2024-02-15 15:42:23
nach vorne
1091 Leute haben es durchsucht

Greifen Sie auf bestimmte Felder einer generischen Struktur zu, die an eine variadische Funktion übergeben wird

Der PHP-Editor Strawberry führt Sie in die allgemeine Struktur eines bestimmten Felds für die Weitergabe des Zugriffs auf Funktionen mit variablen Parametern ein. Eine variadische Funktion ist eine Funktion, die eine variable Anzahl von Parametern akzeptiert. In praktischen Anwendungen müssen wir jedoch häufig die Werte bestimmter Felder an diese Funktionen übergeben. Mit dieser allgemeinen Struktur können wir problemlos auf variadische Funktionen zugreifen und die Werte bestimmter Felder angeben, was eine flexiblere und präzisere Parameterübergabe ermöglicht. Diese gemeinsame Struktur kann unseren Code erheblich vereinfachen und seine Lesbarkeit und Wartbarkeit verbessern.

Frageninhalt

Angenommen, ich habe eine Datei mit dem Namen foo 的通用 struct:

type foo[t any] struct {
    data t
}
Nach dem Login kopieren

Ich habe eine variadische Funktion und möchte einige foos 传递给它。它们可以是任何类型的 foo。我的理解是,因为 foo[int]foo[string] 不同,所以我需要将省略号定义为 any Typen wie diesen konvertieren:

func bar(things ...any) {
    for _, v := range things {
        fmt.println(v)
    }
}
Nach dem Login kopieren

Das funktioniert tatsächlich.

func main() {
    a := foo[string]{"cheese"}
    b := foo[int]{42}

    bar(a, b)
}
Nach dem Login kopieren

Mein Problem ist, dass ich gezielt auf jedes foo 中的 data 字段。但是如果我像这样定义 bar,

zugreifen möchte
func bar(things ...any) {
    for _, v := range things {
        fmt.println(v.data)
    }
}
Nach dem Login kopieren
Der

-Compiler wird sich verständlicherweise über die things 可能是任何东西,因此不能保证它们具有 data-Felder aufregen.

Ich wusste , dass es so etwas geben würde, das data 的字段,因为我总是传递 foos,但我不能指定我只传递 foos heißt,

func bar(things ...foo) {
    for _, v := range things {
        fmt.Println(v.data)
    }
}
Nach dem Login kopieren

Da die Art von foo nicht angegeben ist.

Wie übergebe ich eine unbestimmte Menge foo 传递给 bar,然后访问 data 字段?

解决方法

一种解决方案似乎是使用反射并使用 fieldbyname an bar und greife dann auf das Feld data zu?

Workaroundthings 中的所有内容实际上都是某种 foo

Eine Lösung scheint darin zu bestehen, Reflektion zu verwenden und mit fieldbyname auf das Feld zuzugreifen: 🎜
func bar(things ...any) {
    for _, v := range things {
        x := reflect.ValueOf(v)
        fmt.Println(x.FieldByName("data"))
    }
}
Nach dem Login kopieren
🎜Ich weiß nicht, ob dies aus irgendeinem Grund als Hindernis und/oder Gefahr angesehen werden würde. Vermutlich muss ich dort etwas nachsehen, um sicherzustellen, dass alles in things tatsächlich eine Art 🎜 ist, sonst versuche ich möglicherweise, auf ein Feld zuzugreifen, das nicht existiert. 🎜

Das obige ist der detaillierte Inhalt vonGreifen Sie auf bestimmte Felder einer generischen Struktur zu, die an eine variadische Funktion übergeben wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage