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!
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
any2string(v)
apabila integer2string(v)
yang lebih pantas digunakan. PenyelesaianTidak, 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) } }
any
Anda 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!