比较 和 任何 有什么区别?

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

  • @Teguh是的,它对于映射键很有用,对于必须使用“==”和/或“!=”运算符的任何地方也有好处。 (2认同)