Wie greife ich auf Felder einer anonymen Struktur zu, die in Golang als „interface{}' übergeben wird?

Mary-Kate Olsen
Freigeben: 2024-11-03 22:05:30
Original
886 Leute haben es durchsucht

How to Access Fields of an Anonymous Struct Passed as `interface{}` in Golang?

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>
Nach dem Login kopieren

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)
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage