我需要帮助来理解为什么会抛出这个错误:我使用指针是因为我希望它更新字段。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上试试你修改过的程序。
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消