Setter 方法未设置结构 属性 Golang
Setter method not setting struct property Golang
我需要帮助来理解为什么会抛出这个错误:
我正在使用指针,因为我希望它更新字段。
prog.go:56: cannot use MammalImpl literal (type MammalImpl) as type
Mammal in array element: MammalImpl does not implement Mammal
(SetName method has pointer receiver) prog.go:57: cannot use
MammalImpl literal (type MammalImpl) as type Mammal in array element:
MammalImpl does not implement Mammal (SetName method has pointer
receiver)
我不确定为什么不能 set/override 名称 属性 如下。
package main
import (
"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
问题是您有一个方法 SetName()
,它有一个指针接收器:
func (m *MammalImpl) SetName(s string)
因此,如果您有一个 MammalImpl
类型的值,该值的方法集不包含 SetName()
方法,因此它不会实现 Mammal
接口。
但是指向 MammalImpl
(*MammalImpl
) 的指针的方法集将包含 SetName()
方法,因此它将实现 Mammal
接口。
所以当你填充 mammals
切片时,你必须用 *MammalImpl
值填充它,因为那是实现切片元素类型的那个(即 Mammal
).如果您已经有一个 MammalImpl
值,您可以轻松获得一个指向 MammalImpl
的指针:使用 address &
operator 生成一个指向该值的指针:
mammals := []Mammal{
&MammalImpl{1, "Carnivorious"},
&MammalImpl{2, "Ominivorious"},
}
在 Go Playground 上尝试修改后的程序。
我需要帮助来理解为什么会抛出这个错误:
我正在使用指针,因为我希望它更新字段。
prog.go:56: cannot use MammalImpl literal (type MammalImpl) as type Mammal in array element: MammalImpl does not implement Mammal (SetName method has pointer receiver) prog.go:57: cannot use MammalImpl literal (type MammalImpl) as type Mammal in array element: MammalImpl does not implement Mammal (SetName method has pointer receiver)
我不确定为什么不能 set/override 名称 属性 如下。
package main
import (
"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
问题是您有一个方法 SetName()
,它有一个指针接收器:
func (m *MammalImpl) SetName(s string)
因此,如果您有一个 MammalImpl
类型的值,该值的方法集不包含 SetName()
方法,因此它不会实现 Mammal
接口。
但是指向 MammalImpl
(*MammalImpl
) 的指针的方法集将包含 SetName()
方法,因此它将实现 Mammal
接口。
所以当你填充 mammals
切片时,你必须用 *MammalImpl
值填充它,因为那是实现切片元素类型的那个(即 Mammal
).如果您已经有一个 MammalImpl
值,您可以轻松获得一个指向 MammalImpl
的指针:使用 address &
operator 生成一个指向该值的指针:
mammals := []Mammal{
&MammalImpl{1, "Carnivorious"},
&MammalImpl{2, "Ominivorious"},
}
在 Go Playground 上尝试修改后的程序。