Maison > développement back-end > Golang > Itérer sur des tranches de type mixte

Itérer sur des tranches de type mixte

PHPz
Libérer: 2024-02-09 10:20:10
avant
711 Les gens l'ont consulté

Itérer sur des tranches de type mixte

éditeur php Le découpage itératif de type mixte Baicao est une méthode d'opération de découpage basée sur des itérateurs et des types mixtes. Il offre un moyen flexible de gérer différents types de collections de données, qu'il s'agisse de tableaux, d'objets ou d'autres types. En itérant le découpage de type mixte, nous pouvons découper les données rapidement et efficacement pour obtenir le sous-ensemble dont nous avons besoin. Cette méthode de découpage simplifie non seulement l’écriture du code, mais améliore également l’efficacité de l’exécution du programme. Que ce soit dans le traitement des données, la conception d'algorithmes ou dans d'autres domaines, le découpage itératif de type mixte présente un large éventail de valeurs d'application.

Contenu de la question

J'ai besoin d'avoir différents types de structures dans une tranche. Mais je ne peux pas accéder aux valeurs de champ de chaque structure.

package main

import "fmt"

type X struct {
    Type string
    Num  int
}

type Y struct {
    Type string
    Num  int
}

type Z struct {
    Type string
    Num  int
}

func main() {
    var items []interface{}
    x := X{Type: "X-type", Num: 1}
    items = append(items, x)

    y := Y{Type: "Y-type", Num: 2}
    items = append(items, y)

    z := Z{Type: "Z-type", Num: 3}
    items = append(items, z)

    for _, item := range items {
        fmt.Println(item) //{X-type 1} {Y-type 2} {Z-type 3}
        //fmt.Println(item.Num) // item.Num undefined (type interface{} has no field or method Num)
        //fmt.Println(item.Type) // item.Type undefined (type interface{} has no field or method Type)
    }
}
Copier après la connexion

Comment accéder aux champs individuels de chaque type de structure ?

Solution

Il existe plusieurs options.

Utilisez type de commutateur  :

for _, item := range items {
    switch item := item.(type) {
    case x:
        fmt.printf("x: %d\n", item.num)
    case y:
        fmt.printf("y: %d\n", item.num)
    case z:
        fmt.printf("z: %d\n", item.num)
    default:
        // add code to handle unsupported type
    }
}
Copier après la connexion

Utilisez le package de réflexion pour accéder aux champs par nom :

for _, item := range items {
    fmt.println(reflect.valueof(item).fieldbyname("num").interface().(int))
}
Copier après la connexion

Utilisation de l'interface :

Ajoutez des méthodes d'accès pour chaque type :

func (x x) getnum() int { return x.num }
func (y y) getnum() int { return y.num }
func (z z) getnum() int { return z.num }
Copier après la connexion

Déclarer une interface :

type getnumer interface {
    getnum() int
}
Copier après la connexion

Interface d'utilisation :

var items []GetNumer
x := X{Type: "X-type", Num: 1}
items = append(items, x)
...
for _, item := range items {
    fmt.Println(item) //{X-type 1} {Y-type 2} {Z-type 3}
    fmt.Println(item.GetNum())
}
Copier après la connexion

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal