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

我可以将结构切片指针作为接口切片指针传递吗?


https://play.golang.org/p/EyhGYknZvT2


func (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错误消息


富国沪深
浏览 93回答 1
1回答

人到中年有点甜

没有将任意切片类型自动转换为[]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 []Txr.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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go