Maison > développement back-end > Golang > Comment puis-je parcourir des structures de données inconnues dans Go ?

Comment puis-je parcourir des structures de données inconnues dans Go ?

Susan Sarandon
Libérer: 2024-12-17 15:46:10
original
488 Les gens l'ont consulté

How Can I Iterate Over Unknown Data Structures in Go?

Itérer sur des structures de données dans Go sans connaître les types exacts

Problème :

Comment pouvons-nous parcourir une structure de données (tableau ou carte) en Go sans avoir une connaissance exacte de son type ?

Échec Tentative :

Le code ci-dessous tente de parcourir une interface représentant soit une carte, soit un tableau et d'exécuter une fonction sur chaque élément, mais il échoue en raison de problèmes de vérification de type.

func DoTheThingToAllTheThings(data_interface interface{}) int {
    var numThings int

    switch data := data_interface.(type) {
    case map[interface{}]interface{}:
        numThings = len(data)
        // ...
    case []interface{}:
        numThings = len(data)
        // ...
    default:
        fmt.Println("uh oh!")
    }

    return numThings
}
Copier après la connexion

Solution :

La fonction fmt.Printf("%vn", data_interface) fournit un moyen de parcourir la structure de données sans conversion de type.

func PrintData(data_interface interface{}) {
    fmt.Printf("%v\n", data_interface)
}
Copier après la connexion

Cela fonctionne car le verbe %v dans fmt.Printf utilise la réflexion pour déterminer le type de l'argument et l'imprimer en conséquence.

Reflection in Go :

La fonction fmt.Printf utilise en interne le package Reflect pour inspecter le type de l'argument et décider comment le formater. Le réflexion.ValueOf(arg) renvoie un objet réflexion.Value, qui représente la valeur réelle de l'argument, et réflexion.TypeOf(arg) renvoie le type de la valeur.

Exemple :

Le code suivant reflète une structure Board, puis la reconstitue en une nouvelle variable de la même type.

type Board struct {
    Tboard  [9]string
    Player1 Player
    Player2 Player
}

func main() {
    myBoard := makeBoard()

    v := reflect.ValueOf(*myBoard)
    t := v.Type()

    var b2 Board

    b2 = v.Interface().(Board)
    fmt.Printf("v converted back to: %#v\n", b2)
}
Copier après la connexion

Remarque :

Pour utiliser la réflexion, le type de la structure de données doit être exporté, ce qui signifie qu'elle doit commencer par une lettre majuscule.

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