comparable 和 any 有什么区别?
What is the difference between comparable and any?
我曾尝试在 Go 中使用泛型,但我不太明白我们何时使用 any
或 comparable
作为类型参数。有人可以帮助理解这些吗?
这取决于您想使用什么/如何使用参数类型的值。约束限制了您可以对这些类型的值执行的操作。
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
不应该受到约束,值类型可以是任何类型,我们没有对它做任何事情(只是返回类型 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()
returns what
在切片 s
中第一次出现的索引,如果不在切片中, returns -1
。这里的类型参数V
必须是comparable
,否则不能写v == what
,使用V any
会报compile-time错误。约束 comparable
确保此 find()
函数只能使用定义并允许 ==
运算符的类型实例化(并使用值调用)。
我曾尝试在 Go 中使用泛型,但我不太明白我们何时使用 any
或 comparable
作为类型参数。有人可以帮助理解这些吗?
这取决于您想使用什么/如何使用参数类型的值。约束限制了您可以对这些类型的值执行的操作。
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
不应该受到约束,值类型可以是任何类型,我们没有对它做任何事情(只是返回类型 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()
returns what
在切片 s
中第一次出现的索引,如果不在切片中, returns -1
。这里的类型参数V
必须是comparable
,否则不能写v == what
,使用V any
会报compile-time错误。约束 comparable
确保此 find()
函数只能使用定义并允许 ==
运算符的类型实例化(并使用值调用)。