为了账号安全,请及时绑定邮箱和手机立即绑定

Setter 方法未设置结构属性 Golang

Setter 方法未设置结构属性 Golang

Go
慕斯王 2021-09-13 16:03:31
我需要帮助来理解为什么会抛出这个错误:我使用指针是因为我希望它更新字段。prog.go:56:不能使用 MammalImpl 文字(类型 MammalImpl)作为数组元素中的类型 Mammal:MammalImpl 没有实现 Mammal(SetName 方法有指针接收器) prog.go:57:不能使用 MammalImpl 文字(类型 MammalImpl)作为类型 Mammal在数组元素中: MammalImpl 没有实现 Mammal(SetName 方法有指针接收器)我不确定为什么这无法设置/覆盖 name 属性,如下所示。 package mainimport (    "fmt")type Mammal interface {    GetID() int    GetName() string    SetName(s string)}type Human interface {    Mammal    GetHairColor() string}type MammalImpl struct {    ID   int    Name string}func (m MammalImpl) GetID() int {    return m.ID}func (m MammalImpl) GetName() string {    return m.Name}func (m *MammalImpl) SetName(s string) {    m.Name = s}type HumanImpl struct {    MammalImpl    HairColor string}func (h HumanImpl) GetHairColor() string {    return h.HairColor}func Names(ms []Mammal) *[]string {    names := make([]string, len(ms))    for i, m := range ms {        m.SetName("Herbivorous") // This modification is not having any effect and throws and error        names[i] = m.GetName()    }    return &names}func main() {    mammals := []Mammal{        MammalImpl{1, "Carnivorious"},        MammalImpl{2, "Ominivorious"},    }    numberOfMammalNames := Names(mammals)    fmt.Println(numberOfMammalNames)}Go Playground 代码在这里http://play.golang.org/p/EyJBY3rH23
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

问题是您有一个SetName()具有指针接收器的方法:


func (m *MammalImpl) SetName(s string)

因此,如果您有一个 type 值,则该值MammalImpl的方法集不包含该SetName()方法,因此它不实现该Mammal接口。


但是指向MammalImpl( *MammalImpl)的指针的方法集将包含该SetName()方法,因此它将实现该Mammal接口。


因此,当您填充mammals切片时,您必须用*MammalImpl值填充它,因为这是实现切片元素类型(即Mammal)的值。MammalImpl如果您已经有一个MammalImpl值,您可以轻松获得指向 a 的指针:使用地址&运算符生成指向该值的指针:


mammals := []Mammal{

    &MammalImpl{1, "Carnivorious"},

    &MammalImpl{2, "Ominivorious"},

}

在Go Playground上试试你修改过的程序。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信