Heim > Artikel > Backend-Entwicklung > 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.
Angenommen, ich habe eine Datei mit dem Namen foo
的通用 struct
:
type foo[t any] struct { data t }
Ich habe eine variadische Funktion und möchte einige foo
s 传递给它。它们可以是任何类型的 foo
。我的理解是,因为 foo[int]
与 foo[string]
不同,所以我需要将省略号定义为 any
Typen wie diesen konvertieren:
func bar(things ...any) { for _, v := range things { fmt.println(v) } }
Das funktioniert tatsächlich.
func main() { a := foo[string]{"cheese"} b := foo[int]{42} bar(a, b) }
Mein Problem ist, dass ich gezielt auf jedes foo
中的 data
字段。但是如果我像这样定义 bar
,
func bar(things ...any) { for _, v := range things { fmt.println(v.data) } }Der
-Compiler wird sich verständlicherweise über die things
可能是任何东西,因此不能保证它们具有 data
-Felder aufregen.
Ich wusste , dass es so etwas geben würde, das data
的字段,因为我总是传递 foo
s,但我不能指定我只传递 foo
s heißt,
func bar(things ...foo) { for _, v := range things { fmt.Println(v.data) } }
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
fieldbyname
auf das Feld zuzugreifen: 🎜
func bar(things ...any) { for _, v := range things { x := reflect.ValueOf(v) fmt.Println(x.FieldByName("data")) } }🎜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!