Maison > développement back-end > Golang > le corps du texte

Comment accéder aux champs d'une structure anonyme passée comme `interface{}` dans Golang ?

Mary-Kate Olsen
Libérer: 2024-11-03 22:05:30
original
886 Les gens l'ont consulté

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

Accès aux structures anonymes passées en interface{} dans Golang

En Go, il est possible de définir une interface sans méthode en utilisant la syntaxe interface{}. Cependant, travailler avec des types qui implémentent une telle interface peut présenter des défis, en particulier lorsque vous tentez d'accéder aux champs d'une structure anonyme.

Considérez l'exemple suivant dans lequel vous souhaitez transmettre une structure anonyme en tant que paramètre à une fonction :

<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>
Copier après la connexion

Dans cet exemple, la fonction NewJob prend un paramètre de type interface{} appelé v. À l'intérieur de la fonction, vous définissez le champ personnalisé d'une structure de travail sur v. Vous lancez ensuite le travail avec une goroutine qui exécute la fonction fournie toutes les deux secondes. Dans la goroutine, vous récupérez le champ personnalisé à l'aide de la fonction Custom et tentez d'accéder au champ ID de la structure anonyme. Cependant, vous rencontrerez une erreur :

t.ID undefined (type interface {} is interface with no methods)
Copier après la connexion

Cela est dû au fait que le type interface{} n'a aucune méthode, vous ne pouvez donc pas accéder directement aux champs du type sous-jacent. Pour résoudre ce problème, vous devez d'abord "taper assert" l'interface avec le type approprié avant de pouvoir accéder à ses champs. Dans ce cas, vous savez que le type sous-jacent est la structure anonyme {ID int}, vous pouvez donc la saisir comme suit :

<code class="go">id := v.(struct{ID int}).ID</code>
Copier après la connexion

Par type affirmant v au type de structure correct, vous pouvez maintenant accéder le champ ID comme prévu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal