comparable 和 any 有什么区别?

What is the difference between comparable and any?

我曾尝试在 Go 中使用泛型,但我不太明白我们何时使用 anycomparable 作为类型参数。有人可以帮助理解这些吗?

这取决于您想使用什么/如何使用参数类型的值。约束限制了您可以对这些类型的值执行的操作。

anyinterface{} 的别名,它允许任何类型。如果一个参数可以是任何类型,那基本上不允许你用它做任何事情,因为你不能保证它会是什么。

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() 函数只能使用定义并允许 == 运算符的类型实例化(并使用值调用)。