【问题标题】:Implementing interface in golang gives method has pointer receiver [duplicate]在golang中实现接口给方法有指针接收器[重复]
【发布时间】:2018-02-28 14:52:17
【问题描述】:

我在 Golang 中工作,正在尝试使用接口来组合一组使用类似方法的结构。简而言之,我有这个:

type Person interface {
    BasicInfo() MemberBasicInfo
}

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

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

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)

我错过了什么?还是我做错了什么?

【问题讨论】:

  • 生成此编译器消息的代码在哪里?

标签: go


【解决方案1】:

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

type Person interface {
    BasicInfo() MemberBasicInfo
}

那么任何实现BasicInfo() MemberBasicInfo 的类型都将实现该接口。

在你的情况下,你创建了这个方法:

func (member *Member) BasicInfo() MemberBasicInfo

这意味着*Member 类型满足接口。

但是.. 请注意那里的*Member 没有实现接口,是*Member 实现的。

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

这应该可行:

var p Person
p = &Member{}

但这不会:

var p Person
p = Member{}

【讨论】:

  • 只想说这是我见过的“为什么”这个错误普遍发生的最清晰和最简单的解释。
【解决方案2】:

指针接收器要求您将具体类的指针分配给接口类型的变量。

func usage() {
    var x Person

    // Notice the ampersand '&'
    x = &Member{}

    x.BasicInfo()
}

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2017-02-10
    • 2014-07-30
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多