1 回答

TA貢獻1817條經驗 獲得超14個贊
這取決于您要使用什么/如何使用參數類型的值。約束限制了您可以對這些類型的值執行的操作。
any是interface{}允許任何類型的別名。如果一個參數可以是任何類型,那基本上不允許你用它做任何事情,因為你不能保證它會是什么。
約束只允許可比較的comparable類型,也就是說,允許==和!=運算符在它們的值上使用。如果你想使用類型作為映射中的鍵(映射要求鍵類型是可比較的),或者如果你想在切片中查找元素,并且你想使用==運算符來比較元素,這很好到某事。
例如,讓我們編寫一個通用的 map-get 函數:
func get[K comparable, V any](m map[K]V, key K) V {
return m[key]
}
K鍵類型必須是comparable,否則不能作為某些映射的鍵類型(在m[K]V示例中)。V另一方面不應該被約束,值類型可以是任何東西,我們沒有對它做任何事情(只是返回一個 type 的值V),所以any在這里使用是最好的選擇。
另一個例子,一個 slice-find 函數:
func find[V comparable](what V, s []V) int {
for i, v := range s {
if v == what {
return i
}
}
return -1
}
find()what返回slice中第一次出現的索引s,如果它不在 slice 中,則返回-1。這里的類型參數V必須是comparable,否則不能寫v == what, usingV any會報編譯時錯誤。該約束comparable確保此find()函數只能使用==定義和允許運算符的類型實例化(并使用值調用)。
- 1 回答
- 0 關注
- 179 瀏覽
添加回答
舉報