Heim > Backend-Entwicklung > Golang > Iterieren Sie über gemischte Slices

Iterieren Sie über gemischte Slices

PHPz
Freigeben: 2024-02-09 10:20:10
nach vorne
713 Leute haben es durchsucht

Iterieren Sie über gemischte Slices

php小编百草Iterieren Sie über gemischte Slices是一种基于迭代器和混合类型的切片操作方法。它提供了一种灵活的方式来处理不同类型的数据集合,无论是数组、对象还是其他类型。通过Iterieren Sie über gemischte Slices,我们可以快速、高效地对数据进行切片操作,获取我们需要的子集。这种切片方式不仅简化了代码的编写,还提高了程序的执行效率。无论是在数据处理、算法设计还是其他领域,Iterieren Sie über gemischte Slices都具有广泛的应用价值。

问题内容

我需要在一个切片中有不同类型的结构。但我无法访问每个结构体的字段值。

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)
    }
}
Nach dem Login kopieren

如何访问每种结构类型的各个字段?

解决方法

有几个选项。

使用类型开关

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
    }
}
Nach dem Login kopieren

使用反射包按名称访问字段:

for _, item := range items {
    fmt.println(reflect.valueof(item).fieldbyname("num").interface().(int))
}
Nach dem Login kopieren

使用接口:

为每种类型添加访问器方法:

func (x x) getnum() int { return x.num }
func (y y) getnum() int { return y.num }
func (z z) getnum() int { return z.num }
Nach dem Login kopieren

声明一个接口:

type getnumer interface {
    getnum() int
}
Nach dem Login kopieren

使用接口:

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())
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonIterieren Sie über gemischte Slices. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage