Rumah > pembangunan bahagian belakang > Golang > Adakah mungkin untuk menulis kekangan untuk mengecualikan jenis tertentu?

Adakah mungkin untuk menulis kekangan untuk mengecualikan jenis tertentu?

王林
Lepaskan: 2024-02-14 12:50:07
ke hadapan
815 orang telah melayarinya

Adakah mungkin untuk menulis kekangan untuk mengecualikan jenis tertentu?

editor php Strawberry membawakan anda artikel tentang kekangan menulis untuk mengecualikan jenis tertentu. Dalam PHP, kita boleh menggunakan kekangan jenis untuk mengehadkan jenis parameter fungsi atau kaedah, tetapi adakah mungkin untuk menulis kekangan untuk mengecualikan jenis tertentu? Jawapannya ya. Dengan menggunakan pengendali "!", kami boleh mengecualikan jenis tertentu daripada kekangan jenis, dengan itu mencapai sekatan jenis parameter yang lebih tepat. Dalam artikel ini, kami akan memperincikan cara menggunakan operator "!" untuk mengecualikan jenis dan memberikan contoh kod praktikal. Mari kita terokai topik menarik ini bersama-sama!

Isi soalan

type nonstring interface {
    // ???
}

func myfunc[t nonstring](v t) t {
    return v
}

func main() {
    myfunc(1)          // ok
    myfunc(false)      // ok
    myfunc([]string{}) // ok

    myfunc("hi, boy!") // i hope a comiler error occurs here!  
}
Salin selepas log masuk

Apa yang saya mahu diterangkan dalam ulasan kod di atas.

Boleh ke dalam golang?

Adegan asal

Saya ada dua fungsi seperti berikut:

func Any2String(v any) string {        
    return fmt.Sprint(v) // Slow version
}

func Integer2String[N Integer](v N) string {
    return strconv.FormatInt(int64(v), 10) // Fast version
}
Salin selepas log masuk

any2string(v) 可以将任何 v 转换为字符串。但是,如果 v 是一个整数,则 integer2string(v) Jauh lebih pantas.

Jadi saya mahu pengkompil integer2string(v) 适用时,我希望编译器阻止我调用 any2string(v) menghalang

saya daripada memanggil any2string(v) apabila integer2string(v) yang lebih pantas digunakan.

Penyelesaian

Tidak, ini tidak mungkin. Set jenis kekangan tidak boleh dinyatakan sebagai penolakan set.

Anda boleh menentukan kekangan yang tidak boleh dipenuhi oleh mana-mana jenis, contohnya:

type notsatisfiable interface {
    int
    foo()
}
Salin selepas log masuk
int 并且具有方法 foo()Kekangan ini memerlukan jenis yang tepat

. Memandangkan anda tidak boleh menentukan kaedah pada jenis yang diisytiharkan, adalah mustahil untuk memenuhi kekangan ini.

Walau bagaimanapun, anda tidak boleh menentukan kekangan seperti "any-tolak-int" atau "any-plus-not satisfiable".

Jika fungsi anda adalah sama untuk mana-mana jenis kecuali jenis kuantiti diskret, hanya gunakan suis jenis:

func ToString(v any) string {
    switch t := v.(type) {
    case int:
        return Integer2String(t)
    default:
        return Any2String(t)
    }
}
Salin selepas log masuk
anyAnda tidak memerlukan generik pun, kerana parameter jenis biasa

akan berfungsi dengan baik. 🎜

Atas ialah kandungan terperinci Adakah mungkin untuk menulis kekangan untuk mengecualikan jenis tertentu?. 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