Maison  >  Article  >  développement back-end  >  Comment accéder aux champs d'une structure anonyme passée comme `interface{}` dans Golang ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 22:05:30815parcourir

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>

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)

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>

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!

Déclaration:
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