猿问

如何在切片中附加不同的功能但相同的接口

我尝试附加可以用同一接口表示的不同函数。函数返回不同的对象但相同的接口。它因错误而失败cannot use Test (value of type func() *Dog) as func() Animal value in argument to append (typecheck) 我该怎么办?提前致谢!


package main


type Dog struct {

    Word string

}


type Cat struct {

    Word string

}


func (d *Dog) Say() string {

    return d.Word

}


func (c *Cat) Say() string {

    return c.Word

}


type Animal interface {

    Say() string

}


func main() {

    funcs := []func() Animal{}

    funcs = append(funcs, Test)  // error| cannot use Test (value of type func() *Dog) as func() Animal value in argument to append (typecheck)

}


func Test() *Dog {

    return &Dog{Word: "dog"}

}


func Test2() *Cat {

    return &Cat{Word: "cat"}

}


富国沪深
浏览 135回答 3
3回答

四季花海

更改您的函数以将Animal其作为返回类型。func() *Dog不可转换为func() Animal,它们是两种不同的数据类型。类似于你可以通过的方式,比如说,intas interface{},但不是[]intas[]interface{}

忽然笑

切片元素和函数具有不同的返回类型。使用匿名函数将函数返回值转换为切片元素返回类型。funcs = append(funcs,      func() Animal { return Test() },      func() Animal { return Test2() })for _, f := range funcs {    fmt.Println(f().Say())}在 Playground 上运行它。另一种选择是使用 Reflect 包调用该函数并将结果转换为 Animal。func makeAnimal(f interface{}) Animal {    // This function assumes that f is a function    // that returns a value that satisfies the    // Animal interface.    result := reflect.ValueOf(f).Call(nil)    return result[0].Interface().(Animal)}像这样使用它:funcs := []interface{}{}funcs = append(funcs, Test, Test2)for _, f := range funcs {    a := makeAnimal(f)    fmt.Println(a.Say())}在 Playground 上运行它。

慕少森

问题是func () *Dog无法转换为func() Animal. 如果您不想使用反射,则必须更改“funcs”类型,然后[]interface{}将切片的每个元素转换为func() *Dog并简单地调用它,如下所示:package mainimport "fmt"type Dog struct {    Word string}type Cat struct {    Word string}func (d *Dog) Say() string {    return d.Word}func (c *Cat) Say() string {    return c.Word}type Animal interface {    Say() string}func main() {    var funcs []interface{}    funcs = append(funcs, Test)    fmt.Println(funcs[0].(func() *Dog)().Say()) // prints "dog"}func Test() *Dog {    return &Dog{Word: "dog"}}func Test2() *Cat {    return &Cat{Word: "cat"}}
随时随地看视频慕课网APP

相关分类

Go
我要回答