Maison >développement back-end >Golang >Comment utiliser correctement plusieurs cas dans le commutateur de type Go pour éviter les erreurs de méthode ?

Comment utiliser correctement plusieurs cas dans le commutateur de type Go pour éviter les erreurs de méthode ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-18 10:37:10197parcourir

How to Correctly Use Multiple Cases in Go's Type Switch to Avoid Method Errors?

Commutateur de type avec plusieurs cas

Dans Go, une instruction switch de type peut être utilisée pour sélectionner dynamiquement un cas correspondant en fonction du type de une valeur. Lorsque plusieurs types sont spécifiés dans un seul cas, une erreur peut être générée si le type de la valeur ne correspond à aucun des types répertoriés.

Considérez l'extrait de code suivant :

package main

import (
    "fmt"
)

type A struct {
    a int
}

func(this *A) test(){
    fmt.Println(this)
}

type B struct {
    A
}

func main() {
    var foo interface{}
    foo = A{}
    switch a := foo.(type){
        case B, A:
            a.test()
    }
}

Lorsque ce code est exécuté, il produit l'erreur suivante :

a.test undefined (type interface {} is interface with no methods)

Cette erreur indique que le changement de type n'a pas pris effet car la variable a a le type interface{}, qui n'a pas la méthode test().

La spécification du langage Go explique que dans une instruction switch de type, lorsque plusieurs types sont spécifiés dans un cas, la variable déclarée dans ce cas aura le type de l’expression dans le type switch guard (dans ce cas, foo). Puisque foo est de type interface{}, a devient également un type interface{}.

Pour résoudre ce problème et garantir que la méthode test() peut être appelée, vous pouvez affirmer explicitement que foo a le test( ) avant d'effectuer le changement de type, comme ceci :

package main

import (
    "fmt"
)

type A struct {
    a int
}

func (this *A) test() {
    fmt.Println(this)
}

type B struct {
    A
}

type tester interface {
    test()
}

func main() {
    var foo interface{}
    foo = &B{}
    if a, ok := foo.(tester); ok {
        fmt.Println("foo has test() method")
        a.test()
    }
}

En affirmant que foo a la méthode test(), vous pouvez récupérer une valeur du type approprié et appeler la méthode test() avec succès.

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