Zugriff auf anonyme Strukturen, die als Schnittstelle{} in Golang übergeben werden
In Go ist es möglich, mithilfe der Syntax eine Schnittstelle ohne Methoden zu definieren Schnittstelle{}. Allerdings kann die Arbeit mit Typen, die eine solche Schnittstelle implementieren, eine Herausforderung darstellen, insbesondere wenn versucht wird, auf Felder einer anonymen Struktur zuzugreifen.
Betrachten Sie das folgende Beispiel, in dem Sie eine anonyme Struktur als Parameter an eine Funktion übergeben möchten:
<code class="go">package main import ( "fmt" "log" "time" ) type job struct { name string action func() custom interface{} } func NewJob(t string, name string, c func(), v interface{}) { job := process(t) job.name = name job.action = c job.custom = v go func() { for { job.action() time.Sleep(2 * time.Second) } }() } func Custom(name string) interface{} { for _, j := range jobs { if j.name != name { continue } return j.custom } return nil } func main() { NewJob("every 2 second", "pene", func() { t := Custom("pene") log.Println(t) }, struct { ID int }{ 1, }) }</code>
In diesem Beispiel verwendet die NewJob-Funktion einen Parameter vom Typ interface{} namens v. Innerhalb der Funktion legen Sie das benutzerdefinierte Feld einer Jobstruktur auf v fest. Anschließend starten Sie den Job mit einer Goroutine das die bereitgestellte Funktion alle zwei Sekunden ausführt. Innerhalb der Goroutine rufen Sie das benutzerdefinierte Feld mit der Custom-Funktion ab und versuchen, auf das ID-Feld der anonymen Struktur zuzugreifen. Es tritt jedoch ein Fehler auf:
t.ID undefined (type interface {} is interface with no methods)
Dies liegt daran, dass der Typ interface{} keine Methoden hat, sodass Sie nicht direkt auf Felder des zugrunde liegenden Typs zugreifen können. Um dieses Problem zu beheben, müssen Sie zunächst die Schnittstelle auf den entsprechenden Typ „typzusichern“, bevor Sie auf ihre Felder zugreifen können. In diesem Fall wissen Sie, dass es sich bei dem zugrunde liegenden Typ um die anonyme Struktur {ID int} handelt, sodass Sie sie wie folgt eingeben können:
<code class="go">id := v.(struct{ID int}).ID</code>
Durch Typassertion von v auf den richtigen Strukturtyp können Sie jetzt darauf zugreifen das ID-Feld wie erwartet.
Das obige ist der detaillierte Inhalt vonWie greife ich auf Felder einer anonymen Struktur zu, die in Golang als „interface{}' übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!