为了账号安全,请及时绑定邮箱和手机立即绑定

comparable 和 any 有什么区别?

comparable 和 any 有什么区别?

Go
互换的青春 2022-11-23 15:58:29
我曾尝试在 Go 中使用泛型,但我真的不明白我们何时使用anyorcomparable作为类型参数。有人可以帮助理解这些吗?
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

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


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


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信