Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menentukan kekangan jenis untuk sebarang jenis saluran

Bagaimana untuk menentukan kekangan jenis untuk sebarang jenis saluran

WBOY
WBOYke hadapan
2024-02-13 09:40:09830semak imbas

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 
}

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
}

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

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

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!

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