我的界面中没有几种方法。我有实现这些方法的结构。我注意到不可能将方法集实现为指针接收器,而很少实现为值接收器。
下面是一个界面
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的新手。如果这很明显,我深表歉意。我尝试阅读,但是我只发现每个人都在谈论何时使用指针和值实现。
答案 0 :(得分:2)
您可以在类型的方法中混合使用值接收器和指针接收器,如果您在指针对象上使用值接收器调用方法,或者在非对象上使用指针接收器调用方法,则将转换类型。指针对象(假设它是可寻址的)。但是,如果您需要某种类型来实现接口,则该类型必须定义接口的所有方法。在您的示例中,如果所有方法都用值接收器定义,则可以使类型Contract
实现接口,或者如果所有方法都用指针接收器定义,则可以使类型*Contract
实现接口。 。这里的重点是Contract
和*Contract
是不同的类型,因此要实现接口的任何类型都必须在其上定义所有接口方法。