Lelaran pada kepingan jenis campuran

PHPz
Lepaskan: 2024-02-09 10:20:10
ke hadapan
675 orang telah melayarinya

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)
    }
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

Gunakan pakej refleksi untuk mengakses medan mengikut nama:

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

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 }
Salin selepas log masuk

Isytiharkan antara muka:

type getnumer interface {
    getnum() int
}
Salin selepas log masuk

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())
}
Salin selepas log masuk

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

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!