1 回答
TA贡献1895条经验 获得超7个赞
没有将任意切片类型自动转换为[]interface{}. 有关更多信息,请参阅常见问题解答。
您可以使用反射包来解决问题:
// Shuffle shuffles the slice src to the slice pointed to by dstp.
func (r *Randomizer) Shuffle(dstp interface{}, src interface{}) {
// Create reflect values for each of the slices.
dv := reflect.ValueOf(dstp).Elem()
sv := reflect.ValueOf(src)
// Make the destination slice and copy to it.
dv.Set(reflect.MakeSlice(dv.Type(), sv.Len(), sv.Len()))
reflect.Copy(dv, sv)
// Shuffle the destination.
r.mu.Lock()
r.rand.Shuffle(dv.Len(), reflect.Swapper(dv.Interface()))
r.mu.Unlock()
}
像这样使用它:
r := NewRandomizer()
var rtx []Tx
r.Shuffle(&rtx, txx)
在 Go Playground 上运行它。
如果您在适当的位置随机化,代码会更简单一些:
// Shuffle shuffles the slice pointed to by sp.
func (r *Randomizer) Shuffle(s interface{}) {
v := reflect.ValueOf(s)
r.mu.Lock()
r.rand.Shuffle(v.Len(), reflect.Swapper(v.Interface()))
r.mu.Unlock()
}
在 Go Playground 上运行它。\
我还应该指出,直接编写代码并没有那么糟糕:
r := NewRandomizer()
rtx := append([]Tx(nil), txx...) // copy txx to rtx.
r.mu.Lock()
r.rand.Shuffle(len(rtx), reflect.Swapper(rtx))
r.mu.Unlock()
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报