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 上尝试修改后的程序。