Maison > Article > développement back-end > Comment accéder aux champs d'une structure anonyme passée comme `interface{}` dans 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!