Teg*_*guh 8 generics go comparable any
我尝试在 Go 中使用泛型,但我不太明白何时使用anyorcomparable作为类型参数。有人可以帮助理解这些吗?
icz*_*cza 12
这取决于您想要使用参数类型的值的内容/方式。约束限制了您可以对这些类型的值执行的操作。
anyinterface{}是允许任何类型的别名。如果参数可以是任何类型,则基本上不允许您对其执行任何操作,因为您无法保证它将是什么。
约束comparable仅允许可比较的类型,即允许对它们的值使用==和运算符。!=如果您想使用类型作为映射中的键(映射要求键类型可比较),或者如果您想在切片中查找元素,并且想要使用运算符==来比较元素,那么这非常有用对某事。
作为示例,让我们编写一个通用的 map-get 函数:
func get[K comparable, V any](m map[K]V, key K) V {
return m[key]
}
Run Code Online (Sandbox Code Playgroud)
键K类型必须是comparable,否则不能用作某些映射的键类型(m[K]V示例中)。V另一方面不应该受到限制,值类型可以是任何东西,并且我们没有用它做任何事情(只是返回 type 的值V),所以any在这里使用是最好的选择。
另一个例子,切片查找函数:
func find[V comparable](what V, s []V) int {
for i, v := range s {
if v == what {
return i
}
}
return -1
}
Run Code Online (Sandbox Code Playgroud)
find()what返回 第一次出现在切片 中的索引s,如果不在切片中,则返回-1。这里的类型参数V必须是comparable,否则不能写v == what,usingV any会出现编译时错误。该约束comparable确保该find()函数只能使用==定义并允许运算符的类型实例化(并使用值调用)。