2 回答
TA贡献1803条经验 获得超6个赞
相反,在围棋模仿的JavaScript(为什么???)我想建议由积木组成simmilar所需的操作SliceTricks。
他们是:
完全键入不可知论者(免费考虑“泛型”)。
与从中打包或从中解包相比,速度可能要快得多
[]interface{}
。
TA贡献1806条经验 获得超8个赞
使用反射
如果您真的想做一般性的事情,那么反射是最终的答案。有关 问题的详细信息,请参阅反射包中的MakeSlice文档。
您只需要检索传入切片的类型(使用TypeOf(...))并MakeSlice正确应用即可。
使用反射创建切片的示例:
y := []int{1,2,3}
t := reflect.TypeOf(y)
slice := reflect.MakeSlice(t, 0, 10)
slice = reflect.Append(slice, reflect.ValueOf(2))
fmt.Println(slice.Interface())
在这里运行。
使用 []interface{}
可以使用的另一种方法是[]interface{},它可以存储任何值,但是由于您完全省略了编译器类型检查,因此可能导致运行时出现混乱(这是一件坏事)。
这是[]interface{} 用作任意值存储的示例。这样,您就不需要知道拼接实现中的类型,只需拼接并[]interface{}用于新的切片即可。
这种方法的缺点是,您无法[]interface{}轻松地将某些切片转换为。您必须手动复制它,如之前的文章所述。
结论
无论使用哪个版本,都不会知道类型并手动将其转换回安全性。Go中没有这样的东西可以为您做到这一点。这意味着,您的代码中将具有以下类似内容来重新获得类型安全性:
x := []int{1,2,3,4}
y := splice(x, ...)
yn := []int(y)
- 2 回答
- 0 关注
- 226 浏览
添加回答
举报