第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
富國滬深 2023-07-10 16:40:04
我嘗試附加可以用同一接口表示的不同函數(shù)。函數(shù)返回不同的對象但相同的接口。它因錯誤而失敗cannot use Test (value of type func() *Dog) as func() Animal value in argument to append (typecheck) 我該怎么辦?提前致謝!package maintype 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"}}
查看完整描述

3 回答

?
四季花海

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個贊

更改您的函數(shù)以將Animal其作為返回類型。func() *Dog不可轉(zhuǎn)換為func() Animal,它們是兩種不同的數(shù)據(jù)類型。

類似于你可以通過的方式,比如說,intas interface{},但不是[]intas[]interface{}


查看完整回答
反對 回復(fù) 2023-07-10
?
忽然笑

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

}

在 Playground 上運(yùn)行它。


另一種選擇是使用 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())

}

在 Playground 上運(yùn)行它。



查看完整回答
反對 回復(fù) 2023-07-10
?
慕少森

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"}

}


查看完整回答
反對 回復(fù) 2023-07-10
  • 3 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號