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 关注
- 125 浏览
添加回答
举报