gpt4 book ai didi

pointers - Setter 方法不设置结构属性 Golang

转载 作者:IT王子 更新时间:2023-10-29 02:34:15 24 4
gpt4 key购买 nike

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

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

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)

我不确定为什么无法按如下方式设置/覆盖名称属性。

 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() 方法,因此它不会实现 哺乳动物界面。

但是指向MammalImpl (*MammalImpl) 的方法集将包含SetName() 方法,因此它将实现哺乳动物界面。

因此,当您填充 mammals slice 时,您必须使用 *MammalImpl 值填充它,因为它实现了 slice 的元素类型(是哺乳动物)。如果您已经有一个 MammalImpl 值,您可以很容易地获得一个指向 MammalImpl 的指针:使用 address & operator生成指向该值的指针:

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

Go Playground 上尝试修改后的程序.

关于pointers - Setter 方法不设置结构属性 Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28397240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com