Heim  >  Artikel  >  Backend-Entwicklung  >  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
WBOYnach vorne
2024-02-15 15:42:231073Durchsuche

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
}

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)
    }
}

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,

zugreifen möchte
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 的字段,因为我总是传递 foos,但我不能指定我只传递 foos 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

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"))
    }
}
🎜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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Datumsformat in GoNächster Artikel:Datumsformat in Go