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

我可以将 struct slice 指针作为 []interface 指针传递吗

我可以将 struct slice 指针作为 []interface 指针传递吗

Go
富国沪深 2022-07-11 16:46:00
我可以将结构切片指针作为接口切片指针传递吗?https://play.golang.org/p/EyhGYknZvT2func (r *Randomizer) ShuffleAry(ary *[]interface{}) (v []interface{}) {    r.mu.Lock()    tmp := make([]int, len(*ary))    v = make([]interface{}, len(*ary))    for index := range tmp {        tmp[index] = index    }    // v = append(v, *ary...)    r.rand.Shuffle(len(tmp), func(i, j int) { tmp[i], tmp[j] = tmp[j], tmp[i] })    for index, newIndex := range tmp {        v[index] = (*ary)[newIndex]    }    r.mu.Unlock()    return}收到cannot use &txx (type *[]Tx) as type *[]interface {} in argument to r.ShuffleAry错误消息
查看完整描述

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()


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

添加回答

举报

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