Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Go Generics Boleh Digunakan untuk Mencipta Saluran Jenis-Selamat Mengendalikan Jenis Masa Jalan yang Berbeza?

Bagaimanakah Go Generics Boleh Digunakan untuk Mencipta Saluran Jenis-Selamat Mengendalikan Jenis Masa Jalan yang Berbeza?

Linda Hamilton
Lepaskan: 2024-12-14 22:09:15
asal
289 orang telah melayarinya

How Can Go Generics Be Used to Create Type-Safe Channels Handling Different Runtime Types?

Go Generic Container dengan Pelbagai Jenis Masa Jalan

Apabila ia datang untuk menghantar data melalui saluran ke goroutine untuk pemprosesan selanjutnya, keinginan untuk saluran yang boleh mengendalikan sebarang jenis sering timbul. Dengan pengenalan generik dalam Go 1.18, cabaran sebegitu kelihatan boleh diurus. Walau bagaimanapun, terdapat satu tangkapan: menyatakan jenis saluran kepada goroutine semasa pemulaan kekal sebagai penghalang kerana ia boleh menyimpan sebarang jenis data.

Dalam usaha menangani isu ini, pertimbangkan kod sampel berikut:

type Message[T any] struct {
    Data T
}

type Packet[T any] struct {
    Msg Message[T]
}

func StartController[T any](sender chan Packet[T]) {
    go runThread(sender)
}

func runThread[T any](sender chan Packet[T]) {
    for true {
        data := <-sender
        fmt.Println(data)
    }
}
Salin selepas log masuk

Dalam kod ini, fungsi StartController memulakan goroutine yang melaksanakan fungsi runThread. Walau bagaimanapun, terdapat ralat penyusunan disebabkan oleh percubaan untuk menggunakan jenis generik Packet[antara muka T{}] tanpa instantiasi.

Salah tanggapan biasa terletak pada penggunaan generik untuk mencipta saluran yang boleh menampung sebarang jenis. Sama seperti Java's List, jenis generik mesti dijadikan instantiated dengan parameter jenis konkrit sebelum ia boleh digunakan, menjadikan penggunaan parameter jenis agak sia-sia.

Sebagai contoh, pertimbangkan pengumpul generik Java ArrayList

c := make(chan interface{})
Salin selepas log masuk

Dalam kes ini, saluran boleh menerima sebarang jenis data. Walau bagaimanapun, persoalan timbul: bagaimanakah pengendalian saluran generik harus menerima operasi? Jika apa-apa boleh dihantar ke dalamnya, apakah jenis data item yang diterima?

Oleh itu, penyelesaian yang paling sesuai kekal antara muka chan{} dengan penegasan jenis apabila menerima item, seperti yang dilakukan dalam kod tanpa generik.

Sebaliknya, nilai sebenar generik terletak pada penulisan kod yang mengendalikan jenis sewenang-wenangnya sambil mengekalkan keselamatan jenis. Contohnya:

func receiveAny[T any](c chan T) T {
    return <-c
}
Salin selepas log masuk

Fungsi ini boleh dipanggil sama ada dengan chan int atau rentetan chan.

Atas ialah kandungan terperinci Bagaimanakah Go Generics Boleh Digunakan untuk Mencipta Saluran Jenis-Selamat Mengendalikan Jenis Masa Jalan yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan