Bagaimana untuk menentukan kekangan jenis untuk sebarang jenis saluran

WBOY
Lepaskan: 2024-02-13 09:40:09
ke hadapan
852 orang telah melayarinya

Bagaimana untuk menentukan kekangan jenis untuk sebarang jenis saluran

Kekangan jenis dalam PHP ialah ciri berkuasa yang membolehkan kami menentukan jenis parameter yang diterima dalam parameter fungsi atau kaedah. Bukan sahaja terhad kepada jenis data asas, PHP juga membenarkan kami mentakrifkan kekangan jenis untuk kelas tersuai, antara muka, tatasusunan dan objek boleh lelaran. Dalam artikel ini, kami akan memperkenalkan anda cara untuk menentukan kekangan jenis untuk sebarang jenis saluran untuk mengawal dan melindungi kod kami dengan lebih baik. Sama ada anda seorang pemula atau pembangun yang berpengalaman, petua ini akan membantu anda menjadikan kod anda lebih mudah dibaca dan diselenggara.

Kandungan soalan

Saya cuba mentakrifkan fungsi yang mengembalikan peratusan penggunaan saluran tertentu:

func ChannelUsagePct[T any](channel chan T) int {
    channelCap := cap(channel)
    channelLen := len(channel)
    if channelCap == 0 {
        // Unbuffered channel
        return 0
    }
    return 100 * channelLen / channelCap
}

func main() {
    twoWayChannel := make(chan int, 10)
    var sendOnlyChannel chan<- int = twoWayChannel
    var recvOnlyChannel <-chan int = twoWayChannel

    fmt.Println(ChannelUsagePct(twoWayChannel))
    fmt.Println(ChannelUsagePct(sendOnlyChannel)) // Does not work 
    fmt.Println(ChannelUsagePct(recvOnlyChannel))  // Does not work 
}
Salin selepas log masuk

Sekarang masalahnya ialah tanpa menukar tandatangan func, ini berfungsi untuk saluran pertama tetapi bukan untuk saluran kedua dan ketiga. Tetapi jika saya menukar tandatangan saya perlu memilih saluran untuk menerima sahaja atau menghantar sahaja. Adakah terdapat cara untuk menentukan saluran laluan sifar? Contohnya. Tidak boleh membaca atau menulis, saya hanya mahu menggunakan fungsi caplen di atasnya. Sebaik-baiknya, channelusagepct harus berfungsi dalam mana-mana daripada 3 situasi ini.

Penyelesaian

Untuk membenarkan ketiga-tiga kemungkinan bentuk saluran, kekangan jenis yang berasingan perlu ditakrifkan.

type chan[t any] interface {
    chan t | <-chan t | chan<- t
}
Salin selepas log masuk

Ini memerlukan instantiating kekangan jenis dengan t apabila menggunakannya, yang boleh dilakukan menggunakan parameter jenis lain:

func cap[t any, c chan[t]](c c) int {
    return cap(c)
}
Salin selepas log masuk

Disebabkan instantiasi, keseluruhan jenis tidak boleh disimpulkan, tetapi hanya jenis elemen saluran perlu disediakan:

ch := make(chan int, 3)
i := Cap[int](ch)
fmt.Println(i)
// 3
Salin selepas log masuk

https://www.php.cn/link/ca279b8542ab30bd43469423ce703e66

Atas ialah kandungan terperinci Bagaimana untuk menentukan kekangan jenis untuk sebarang jenis saluran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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!