php小編草莓為您帶來了一篇關於編寫約束來排除某種類型的文章。在PHP中,我們可以使用型別約束來限制函數或方法的參數類型,但是否可以寫一個限制來排除某種類型呢?答案是肯定的。透過使用“!”操作符,我們可以在類型約束中排除某種類型,從而實現更精確的參數類型限制。在本文中,我們將詳細介紹如何使用「!」操作符來排除某種類型,並給出實際的程式碼範例。讓我們一起來探索這個有趣的主題吧!
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! }
上面程式碼的註解中描述了我想要的內容。
在golang中可以嗎?
原始場景
我有兩個功能,如下:
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)
速度會快得多。
因此,當更快的 integer2string(v)
適用時,我希望編譯器阻止我呼叫 any2string(v)
。
不,這是不可能的。約束類型集合不能表示為集合減法。
可以定義任何類型都無法滿足的約束,例如:
type notsatisfiable interface { int foo() }
此約束要求類型完全為 int
並且具有方法 foo()
。由於您無法在預先聲明的類型上定義方法,因此不可能滿足此限制。
但是,您不能定義像「any-minus-int」或「any-plus-notsatisfiable」這樣的限制。
如果您的函數對於離散數量類型以外的任何類型都完全相同,則只需使用類型開關:
func ToString(v any) string { switch t := v.(type) { case int: return Integer2String(t) default: return Any2String(t) } }
您甚至不需要泛型,因為 any
類型的常規參數就可以正常運作。
以上是是否可以編寫一個約束來排除某種類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!