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

尝试对切片使用interface {}以选择随机元素

尝试对切片使用interface {}以选择随机元素

Go
三国纷争 2021-05-14 18:43:53
我一直在尝试实现一个可以从任何类型的切片中随机选择一个元素的函数(例如python的random.choice函数)func RandomChoice(a []interface{}, r *rand.Rand) interface{} {    i := r.Int()%len(a)    return a[i]}但是,当我尝试将[] float32类型的切片传递到第一个参数中时,会发生此错误:cannot use my_array (type []float32) as type []interface {} in function argument这是对接口{}的根本性滥用吗?有什么更好的方法吗?
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

使用反射:


func RandomChoice(slice interface{}, r *rand.Rand) interface{} {

    x := reflect.ValueOf(slice)

    return x.Index(r.Intn(x.Len())).Interface()

}


查看完整回答
反对 回复 2021-05-31
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

根据语言规范

两种类型相同或不同。

如果两个命名类型的类型名称源自同一TypeSpec,则它们是相同的。命名类型和未命名类型始终是不同的。如果对应的类型文字相同,即它们具有相同的文字结构且对应的组件具有相同的类型,则两个未命名的类型相同。详细:

  • 如果两个数组类型具有相同的元素类型和相同的数组长度,则它们是相同的。

  • 如果两个切片类型具有相同的元素类型,则它们是相同的。

  • 如果两个结构类型具有相同的字段序列,并且对应的字段具有相同的名称,相同的类型和相同的标记,则它们是相同的。两个匿名字段被认为具有相同的名称。来自不同程序包的小写字段名称始终是不同的。

  • 如果两个指针类型具有相同的基本类型,则它们是相同的。

  • 如果两个函数类型具有相同数量的参数和结果值,相应的参数和结果类型相同,并且两个函数都是可变参数,或者两个都不相同。参数名和结果名不需要匹配。

  • 如果两个接口类型具有相同的方法集,相同的名称和相同的函数类型,则它们是相同的。来自不同程序包的小写方法名称始终是不同的。方法的顺序无关紧要。

  • 如果两个映射类型具有相同的键和值类型,则它们是相同的。

  • 如果两个通道类型具有相同的值类型和相同的方向,则它们是相同的。

和:

在以下任何一种情况下,可以将值x分配给类型T的变量(“ x可以分配给T”):

  • x的类型与T相同。

  • x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是命名类型。

  • T是接口类型,并且x实现T。

  • x是双向通道值,T是通道类型,x的类型V和T具有相同的元素类型,并且V或T中的至少一个不是命名类型。

  • x是预声明的标识符nil,T是指针,函数,切片,映射,通道或接口类型。

  • x是可由类型T的值表示的无类型常量。

任何值都可以分配给空白标识符。

您无法将[] MyType分配给[]接口{},将这两个结果结合在一起。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

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