go - 在golang中实现接口(interface)给方法有指针接收者

标签 go

<分区>

我在 Golang 工作,我正在尝试使用接口(interface)来对一组使用类似方法的结构进行分组。简而言之,我有这个:

type Person interface {
    BasicInfo() MemberBasicInfo
}

type MemberBasicInfo struct {
    ID                         uint       
    MemberFirstName            string     
    MemberNickname             string     
    MemberEmail                string    
}

然后,应该作为接口(interface)工作的结构:

func (member *Member) BasicInfo() MemberBasicInfo{
    return MemberBasicInfo{
        ID: member.ID,
        ...other mapping here...
    }
}

func (user *User) BasicInfo() MemberBasicInfo{
    return MemberBasicInfo{
        ID: uint(user.ID),
        ...other mapping here...
    }
}

cannot use memberData (type Member) as type Member.Person in return argument: Member does not implement Person (BasicInfo method has pointer receiver)
cannot use memberData (type User) as type Person in return argument: User does not implement Person (BasicInfo method has pointer receiver)

我错过了什么?或者我做错了什么?

最佳答案

如果你的接口(interface)是这样声明的:

type Person interface {
    BasicInfo() MemberBasicInfo
}

然后任何实现 BasicInfo() MemberBasicInfo 的类型都将实现该接口(interface)。

在您的例子中,您随后创建了这个方法:

func (member *Member) BasicInfo() MemberBasicInfo

这意味着 *Member 类型实现了接口(interface)。

但是.. 注意那里的*Member 不实现接口(interface),是 *Member 实现的。

因此,当尝试将类型分配给接口(interface)变量时,请确保使用指针而不是直接值。

这应该有效:

var p Person
p = &Member{}

但这不会:

var p Person
p = Member{}

关于go - 在golang中实现接口(interface)给方法有指针接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46306888/

相关文章:

go - 将数据解码为任何结构

json - 在 golang 中为 Places API 使用 HTTP 客户端,解码 JSON 和无效字符

mysql - 无法连接到我的 mac 上运行的 mysql

json - GoLang JSON解码

Gorilla session 存储在 localStorage 中

go - Bufio Scanner Goroutine-截断/无序输出

go - GoLang 接口(interface)名称及其方法数的规则

go - 为什么 go 需要双引号导入声明

go - 从不同的 go 例程将数据写入同一 channel ,无需 WaitGroup 即可正常工作

encoding - 如何在 http 响应正文中返回编码字符串?