为什么golang duck type在我的代码下面不适用于我?

时间:2017-01-18 07:40:52

标签: go

在下面的代码中,我正在尝试创建Model接口和API接口的具体实现:

package main

import "fmt"

/////////

type Model interface {
    ID() string
}

type API interface {
    Create(Model)
}

/////////

type ConcreteModel struct {}

func (model ConcreteModel) ID() string {
    return "123"
}

func (model ConcreteModel) Name() string {
    return "aron"
}

type ConcreteAPI struct{}

func (api ConcreteAPI) Create(model ConcreteModel) {
    fmt.Println("Created concrete model with id " + model.ID() + ", name " + model.Name())
}

func main() {
    // invocation via interface
    func(api API) {
        api.Create(ConcreteModel{})
    }(ConcreteAPI{})
}

对我来说完全混淆是运行此代码时出现以下错误的原因:

ConcreteAPI does not implement API (wrong type for Create method)
        have Create(ConcreteModel)
        want Create(Model)

从我收集的关于golang ducktyping的内容来看,似乎ConcreteAPI应该履行Create(Model)的契约,因为ConcreteModel具有Model所需的方法,即ID() string

我想尝试做类似这样的事情的原因是func(api API)是知道如何在我的预期真实代码库中使用具体API实现的东西的替身。

有没有人就如何制作上述实际工作提出建议?

1 个答案:

答案 0 :(得分:0)

ConcreteAPI没有实现API的方法,请添加:

func(concreteApi * ConcreteAPI)创建(模型){}

但您有其他错误,请参阅以下详细信息: ConcreteModel也不实现Model