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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

不能使用(類(lèi)型函數(shù)(d 狗))作為類(lèi)型函數(shù)(動(dòng)物動(dòng)物)

不能使用(類(lèi)型函數(shù)(d 狗))作為類(lèi)型函數(shù)(動(dòng)物動(dòng)物)

Go
寶慕林4294392 2022-10-04 19:54:15
我正在努力編寫(xiě)一個(gè)方法可以同時(shí)將和方法作為其參數(shù),而我的IDE告訴我:callGetNamegetCatNamegetDogName不能使用“獲取狗名”(類(lèi)型函數(shù)(d 狗))作為類(lèi)型函數(shù)(動(dòng)物動(dòng)物)package maintype Animal struct {    Name string}type Cat struct {    Animal}type Dog struct {    Animal}func getCatById(c Cat) {}func validateDogNames(d Dog) {}func invokeFunc(f func(animal Animal)) {}func main() {    invokeFunc(getCatById)    invokeFunc(validateDogNames)}我試圖分析原因,也許是因?yàn)楦呃酥С侄嘀乩^承?請(qǐng)讓我知道我是否在做一些愚蠢的事情,或者有沒(méi)有更好的方法來(lái)實(shí)現(xiàn)這一目標(biāo)?========關(guān)于我為什么要嘗試這個(gè):在go-kit框架中,我必須為每個(gè)定義的服務(wù)方法編寫(xiě)makeEndpoint函數(shù)。我用反射來(lái)采用一個(gè)通用的制作端點(diǎn),如下所示:func NewProductEndpoints() ProductEndpoints {    ps := service.NewProductService()    return ProductEndpoints{        GetProductById: makeEndpoint(ps, util.GetFunctionName(ps.GetProductById)),        CreateProduct: makeEndpoint(ps, util.GetFunctionName(ps.CreateProduct)),    }}func makeEndpoint(s service.ProductService, funcName string) kitEndpoint.Endpoint {    return func(ctx context.Context, request interface{}) (response interface{}, err error) {        req := request.(domain.ProductDTO)        currFunc := reflect.ValueOf(s).MethodByName(funcName)        args := []reflect.Value{reflect.ValueOf(req)}        res := currFunc.Call(args)[0]        return res, nil    }}想知道是否有更好的方法來(lái)實(shí)現(xiàn)。提前致謝。
查看完整描述

1 回答

?
喵喔喔

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

所以你以一種相當(dāng)OOP的方式思考,Go沒(méi)有繼承(澄清它有結(jié)構(gòu)嵌入,這就是你在第一個(gè)例子中所做的)。我們傾向于用組合來(lái)解決問(wèn)題。


您可以考慮解決問(wèn)題的一種方法是如下所示。


package main


import (

    "fmt"

)


type Namer interface {

    Name() string

}


type Cat struct {

    name string

}


func (c Cat) Name() string {

    return c.name

}


type Dog struct {

    name string

}


func (d Dog) Name() string {

    return d.name

}


func PetName(n Namer) {

    fmt.Println(n.Name())

}


func main() {

    PetName(Dog{name: "Fido"})

    PetName(Cat{name: "Mittens"})

}

名稱可以改進(jìn),但它應(yīng)作為可以采取的方法的基本示例。


編輯:基于下面留下的評(píng)論的示例


package main


import (

    "fmt"

)


type Invoker interface {

    Invoke()

}


type Dog struct{}


func (Dog) Bark() {

    fmt.Println("Woof")

}

func (d Dog) Invoke() {

    d.Bark()

}


type Cat struct{}


func (Cat) Meow() {

    fmt.Println("Meow")

}

func (c Cat) Invoke() {

    c.Meow()

}


func CallFunc(i Invoker) {

    i.Invoke()

}


func main() {

    CallFunc(Cat{})

    CallFunc(Dog{})

}


查看完整回答
反對(duì) 回復(fù) 2022-10-04
  • 1 回答
  • 0 關(guān)注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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