首頁 > 後端開發 > Golang > 迭代混合類型切片

迭代混合類型切片

PHPz
發布: 2024-02-09 10:20:10
轉載
713 人瀏覽過

迭代混合類型切片

php小編百草迭代混合型別切片是一種基於迭代器和混合型別的切片操作方法。它提供了一種靈活的方式來處理不同類型的資料集合,無論是數組、物件還是其他類型。透過迭代混合類型切片,我們可以快速、有效率地對資料進行切片操作,以取得我們需要的子集。這種切片方式不僅簡化了程式碼的編寫,也提高了程式的執行效率。無論是在資料處理、演算法設計或其他領域,迭代混合類型切片都具有廣泛的應用價值。

問題內容

我需要在一個切片中有不同類型的結構。但我無法存取每個結構體的字段值。

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)
    }
}
登入後複製

如何存取每種結構類型的各個欄位?

解決方法

有幾個選項。

使用類型開關

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
    }
}
登入後複製

使用反射包按名稱存取欄位:

for _, item := range items {
    fmt.println(reflect.valueof(item).fieldbyname("num").interface().(int))
}
登入後複製

使用介面:

#為每種類型新增存取器方法:

func (x x) getnum() int { return x.num }
func (y y) getnum() int { return y.num }
func (z z) getnum() int { return z.num }
登入後複製

宣告一個介面:

type getnumer interface {
    getnum() int
}
登入後複製

使用介面:

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())
}
登入後複製

以上是迭代混合類型切片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板