结构将接口方法实现为指针接收者或值接收者

时间:2019-07-14 14:20:15

标签: go interface

我的界面中没有几种方法。我有实现这些方法的结构。我注意到不可能将方法集实现为指针接收器,而很少实现为值接收器。

下面是一个界面

type ContractCRUD interface {
    addContract() bool
    deleteContract() bool
    updateContract() bool
    addAPI(apipath string) bool
    getContractByNameAndGroup(user string, group APIGroup) error
    getObject() Contract
}

将实现ContractCRUD接口的结构

type Contract struct {
    id             int64
    User           string
    Group          APIGroup
    AllowedRequest int64
    Window         int16
}

只列出函数定义。

func (c Contract) getObject() Contract {...}
func (c Contract) addContract() bool {...}
.
.
.
func (c *Contract) getContractByNameAndGroup(user string, group APIGroup) error {..}

通过这样的实现,即使是getObject和addContact,也希望指针能够接收。

func RegisterAPI(c ContractCRUD) bool {
    contract := c.getObject()
    fmt.Printf("Register the user %s under the group %s with the limit %d per %d minute(s)\n", contract.User, contract.Group, contract.AllowedRequest, contract.Window)
    return c.addContract()
}

主要位置

...
registration.RegisterAPI(*c)

我遇到以下错误

cannot use *c (type registration.Contract) as type registration.ContractCRUD in argument to registration.RegisterAPI:
    registration.Contract does not implement registration.ContractCRUD (registration.getContractByNameAndGroup method has pointer receiver)

所以我知道我无法混合实现,但是我似乎不明白为什么。我是Go的新手。如果这很明显,我深表歉意。我尝试阅读,但是我只发现每个人都在谈论何时使用指针和值实现。

1 个答案:

答案 0 :(得分:2)

您可以在类型的方法中混合使用值接收器和指针接收器,如果您在指针对象上使用值接收器调用方法,或者在非对象上使用指针接收器调用方法,则将转换类型。指针对象(假设它是可寻址的)。但是,如果您需要某种类型来实现接口,则该类型必须定义接口的所有方法。在您的示例中,如果所有方法都用值接收器定义,则可以使类型Contract实现接口,或者如果所有方法都用指针接收器定义,则可以使类型*Contract实现接口。 。这里的重点是Contract*Contract是不同的类型,因此要实现接口的任何类型都必须在其上定义所有接口方法。