Rumah >pembangunan bahagian belakang >Golang >Lelaran pada kepingan jenis campuran

Lelaran pada kepingan jenis campuran

PHPz
PHPzke hadapan
2024-02-09 10:20:10717semak imbas

Lelaran pada kepingan jenis campuran

editor php Baicao iterative mixed type slicing ialah kaedah operasi penghirisan berdasarkan iterator dan jenis campuran. Ia menyediakan cara yang fleksibel untuk mengendalikan pelbagai jenis pengumpulan data, sama ada tatasusunan, objek atau jenis lain. Dengan mengulang penghirisan jenis campuran, kami boleh memotong data dengan cepat dan cekap untuk mendapatkan subset yang kami perlukan. Kaedah penghirisan ini bukan sahaja memudahkan penulisan kod, tetapi juga meningkatkan kecekapan pelaksanaan program. Sama ada dalam pemprosesan data, reka bentuk algoritma atau medan lain, penghirisan jenis campuran berulang mempunyai nilai aplikasi yang luas.

Kandungan soalan

Saya perlu mempunyai pelbagai jenis struktur dalam kepingan. Tetapi saya tidak boleh mengakses nilai medan setiap struct.

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

Bagaimana untuk mengakses medan individu bagi setiap jenis struct?

Penyelesaian

Terdapat beberapa pilihan.

Gunakan jenis suis :

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

Gunakan pakej refleksi untuk mengakses medan mengikut nama:

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

Antara muka penggunaan:

Tambah kaedah pengakses untuk setiap jenis:

func (x x) getnum() int { return x.num }
func (y y) getnum() int { return y.num }
func (z z) getnum() int { return z.num }

Isytiharkan antara muka:

type getnumer interface {
    getnum() int
}

Antara muka penggunaan:

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

Atas ialah kandungan terperinci Lelaran pada kepingan jenis campuran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam