Setter方法没有设置struct property Golang

时间:2015-02-08 17:50:00

标签: pointers methods go struct

我需要帮助来理解为什么会抛出这个错误:

我正在使用指针,因为我希望它更新字段。

  

prog.go:56:不能使用MammalImpl文字(类型MammalImpl)作为类型   数组元素中的哺乳动物:MammalImpl不实现哺乳动物   (SetName方法有指针接收器)prog.go:57:不能使用   MammalImpl文字(类型MammalImpl)作为数组元素中的Mammal类型:     MammalImpl没有实现Mammal(SetName方法有指针   接收器)

我不知道为什么无法设置/覆盖name属性,如下所示。

 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

1 个答案:

答案 0 :(得分:3)

问题是你有一个方法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上尝试修改后的程序。