Go语言 如何将一个类型A的切片传递给一个函数,该函数接受一个由A优雅地实现的接口切片?[duplicate]

6jygbczu  于 2023-02-17  发布在  Go
关注(0)|答案(2)|浏览(115)
    • 此问题在此处已有答案**:

(9个答案)
Cannot convert []string to []interface {}(7个答案)
Cannot use args (type []string) as type []interface {} [duplicate](1个答案)
slice of struct != slice of interface it implements?(6个答案)
4天前关闭。
我有两个类型AssetClipsVideos来实现接口调用timelineClip,我想传递一个[]AssetClips或者[]Videos给一个函数,这个函数接受一个[]timelineClip作为参数,但是编译器抱怨了,我不明白为什么,我最后做了一个for循环来把我的[]AssetClips[]Videos转换成[]timelineClip
有必要吗?有没有更优雅的方法?

// myFunctionThatTakesASliceOfTimelineClips(assetClips) is not possible
    // myFunctionThatTakesASliceOfTimelineClips(videos) is not possible

    var timelineClips []timelineClip
    for _, assetClip := range assetClips {
        timelineClips = append(timelineClips, assetClip)
    }

    for _, video := range videos {
        timelineClips = append(timelineClips, video)
    }

    myFunctionThatTakesASliceOfTimelineClips(timelineClips)
z18hc3ub

z18hc3ub1#

这是必要的,而且这是一种优雅的方式。
这是必要的,因为传递接口切片的机制与传递结构体切片的机制不同。结构体切片的每个元素都是结构体本身的副本,而接口的元素是指向结构体示例及其类型的接口。

kg7wmglp

kg7wmglp2#

如果你想避免复制,你可以使用泛型。简而言之,你只需要改变

func myFunctionThatTakesASliceOfTimelineClips(timelineClips []timelineClip)

func myFunctionThatTakesASliceOfTimelineClips[T timelineClip](timelineClips []T)

例如:
https://go.dev/play/p/FTj8rMYq9GF

package main

import "fmt"

type Exampler interface {
    Example()
}

type A struct{}
type B struct{}

func (a A) Example() {
    fmt.Println("it worked")
}
func (b B) Example() {
    fmt.Println("it worked")
}

func DoExample[T Exampler](tt []T) {
    for _, t := range tt {
        t.Example()
    }
}
func main() {
    aa := []A{{}}
    bb := []B{{}}

    DoExample(aa)
    DoExample(bb)
}

相关问题