3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個贊
更改您的函數(shù)以將Animal
其作為返回類型。func() *Dog
不可轉(zhuǎn)換為func() Animal
,它們是兩種不同的數(shù)據(jù)類型。
類似于你可以通過的方式,比如說,int
as interface{}
,但不是[]int
as[]interface{}

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個贊
切片元素和函數(shù)具有不同的返回類型。使用匿名函數(shù)將函數(shù)返回值轉(zhuǎn)換為切片元素返回類型。
funcs = append(funcs,
func() Animal { return Test() },
func() Animal { return Test2() })
for _, f := range funcs {
fmt.Println(f().Say())
}
另一種選擇是使用 Reflect 包調(diào)用該函數(shù)并將結(jié)果轉(zhuǎn)換為 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())
}

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個贊
問題是func () *Dog無法轉(zhuǎn)換為func() Animal. 如果您不想使用反射,則必須更改“funcs”類型,然后[]interface{}將切片的每個元素轉(zhuǎn)換為func() *Dog并簡單地調(diào)用它,如下所示:
package main
import "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"}
}
- 3 回答
- 0 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)