我曾尝试在 Go 中使用泛型,但我真的不明白我们何时使用anyorcomparable作为类型参数。有人可以帮助理解这些吗?
互换的青春
浏览 245回答 1
1回答
大话西游666
这取决于您要使用什么/如何使用参数类型的值。约束限制了您可以对这些类型的值执行的操作。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()函数只能使用==定义和允许运算符的类型实例化(并使用值调用)。