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

Itérer sur des tranches de type mixte

PHPz
PHPzavant
2024-02-09 10:20:10583parcourir

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)
    }
}

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
    }
}

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))
}

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 }

Déclarer une interface :

type getnumer interface {
    getnum() int
}

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())
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer