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

Adakah mungkin untuk menulis kekangan untuk mengecualikan jenis tertentu?

王林
王林ke hadapan
2024-02-14 12:50:07703semak imbas

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

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
}

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

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