Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers Setter方法未设置结构属性Golang_Pointers_Methods_Go_Struct - Fatal编程技术网

Pointers Setter方法未设置结构属性Golang

Pointers Setter方法未设置结构属性Golang,pointers,methods,go,struct,Pointers,Methods,Go,Struct,我需要帮助理解抛出此错误的原因: 我使用指针是因为我希望它更新字段 prog.go:56:无法将哺乳动物impl文本(类型哺乳动物impl)用作类型 数组元素中的哺乳动物:哺乳动物impl不实现哺乳动物 (SetName方法具有指针接收器)程序go:57:无法使用 作为数组元素中的类型哺乳动物的哺乳动物impl文本(类型哺乳动物impl): MailomImpl未实现Mailoman(SetName方法具有指针 (接收机) 我不确定为什么无法按如下方式设置/覆盖name属性 package m

我需要帮助理解抛出此错误的原因:

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

prog.go:56:无法将哺乳动物impl文本(类型哺乳动物impl)用作类型 数组元素中的哺乳动物:哺乳动物impl不实现哺乳动物 (SetName方法具有指针接收器)程序go:57:无法使用 作为数组元素中的类型哺乳动物的哺乳动物impl文本(类型哺乳动物impl): MailomImpl未实现Mailoman(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 Playerd代码在这里

问题是您有一个方法
SetName()
,它有一个指针接收器:

func (m *MammalImpl) SetName(s string)
因此,如果您有一个类型为
哺乳动物impl
的值,则该值的方法集不包含
SetName()
方法,因此它不实现
哺乳动物
接口

但是指向
哺乳动物impl
*哺乳动物impl
)的指针的方法集将包含
SetName()
方法,因此它将实现
哺乳动物
接口

因此,当您填充
哺乳动物
切片时,必须用
*哺乳动物impl
值填充它,因为这是实现切片元素类型的值(即
哺乳动物
)。如果您已经有
哺乳动物impl
值,则可以轻松获取指向该值的指针:使用生成指向该值的指针:

mammals := []Mammal{
    &MammalImpl{1, "Carnivorious"},
    &MammalImpl{2, "Ominivorious"},
}

在上尝试修改后的程序。

问题在于您有一个方法
SetName()
,该方法具有指针接收器:

func (m *MammalImpl) SetName(s string)
因此,如果您有一个类型为
哺乳动物impl
的值,则该值的方法集不包含
SetName()
方法,因此它不实现
哺乳动物
接口

但是指向
哺乳动物impl
*哺乳动物impl
)的指针的方法集将包含
SetName()
方法,因此它将实现
哺乳动物
接口

因此,当您填充
哺乳动物
切片时,必须用
*哺乳动物impl
值填充它,因为这是实现切片元素类型的值(即
哺乳动物
)。如果您已经有
哺乳动物impl
值,则可以轻松获取指向该值的指针:使用生成指向该值的指针:

mammals := []Mammal{
    &MammalImpl{1, "Carnivorious"},
    &MammalImpl{2, "Ominivorious"},
}

在上尝试修改后的程序。

问题在于您有一个方法
SetName()
,该方法具有指针接收器:

func (m *MammalImpl) SetName(s string)
因此,如果您有一个类型为
哺乳动物impl
的值,则该值的方法集不包含
SetName()
方法,因此它不实现
哺乳动物
接口

但是指向
哺乳动物impl
*哺乳动物impl
)的指针的方法集将包含
SetName()
方法,因此它将实现
哺乳动物
接口

因此,当您填充
哺乳动物
切片时,必须用
*哺乳动物impl
值填充它,因为这是实现切片元素类型的值(即
哺乳动物
)。如果您已经有
哺乳动物impl
值,则可以轻松获取指向该值的指针:使用生成指向该值的指针:

mammals := []Mammal{
    &MammalImpl{1, "Carnivorious"},
    &MammalImpl{2, "Ominivorious"},
}

在上尝试修改后的程序。

问题在于您有一个方法
SetName()
,该方法具有指针接收器:

func (m *MammalImpl) SetName(s string)
因此,如果您有一个类型为
哺乳动物impl
的值,则该值的方法集不包含
SetName()
方法,因此它不实现
哺乳动物
接口

但是指向
哺乳动物impl
*哺乳动物impl
)的指针的方法集将包含
SetName()
方法,因此它将实现
哺乳动物
接口

因此,当您填充
哺乳动物
切片时,必须用
*哺乳动物impl
值填充它,因为这是实现切片元素类型的值(即
哺乳动物
)。如果您已经有
哺乳动物impl
值,则可以轻松获取指向该值的指针:使用生成指向该值的指针:

mammals := []Mammal{
    &MammalImpl{1, "Carnivorious"},
    &MammalImpl{2, "Ominivorious"},
}
在计算机上尝试修改后的程序