猿问

Setter 方法未设置结构属性 Golang

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


我使用指针是因为我希望它更新字段。


prog.go:56:不能使用 MammalImpl 文字(类型 MammalImpl)作为数组元素中的类型 Mammal:MammalImpl 没有实现 Mammal(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


慕斯王
浏览 125回答 1
1回答

SMILET

问题是您有一个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上试试你修改过的程序。
随时随地看视频慕课网APP

相关分类

Go
我要回答