为了账号安全,请及时绑定邮箱和手机立即绑定

我应该如何声明一个接口,该接口具有返回不同接口的一部分的方法?

我应该如何声明一个接口,该接口具有返回不同接口的一部分的方法?

Go
LEATH 2023-06-12 17:00:29
这是我创建的一个示例,我在其中声明了我的第一个结构,它是一个Toolbox包含 slice 的结构Hammers。Toolbox我为和制作了一个接口Hammer,这样其他人就可以使用我的函数而不必使用我的结构,只要他们遵循我的接口实现即可。package mainimport "fmt"type ToolboxInterface interface {    GetHammers() []HammerInterface}type HammerInterface interface {}type Toolbox struct {    Hammers []Hammer}func (t Toolbox)GetHammers() []HammerInterface  {    return []HammerInterface{t.Hammers}}type Hammer struct {    Color string}func CountHammersInToolbox(t ToolboxInterface) int {    hammers := t.GetHammers()    return len(hammers)}func main()  {    toolbox := Toolbox{Hammers: []Hammer{        {Color: "Red"},        {Color: "Blue"},        {Color: "Green"}}}    fmt.Println(len(toolbox.Hammers))    fmt.Println(CountHammersInToolbox(toolbox))}我ToolboxInterface声明了GetHammers()我已经实现的方法。但是,CountHammersInToolbox 方法返回 1 而不是输出中看到的 3。uberswe$ go run scratch/main.go 31我尝试了不同的变体,但我觉得有点卡住了。我不明白为什么它返回 1 但我怀疑我以错误的方式声明了我的接口方法。我应该如何声明一个接口,该接口具有返回不同接口的一部分的方法?
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

您的接口定义没有任何问题。问题是您没有正确转换[]Hammer为[]HammerInterface. 看起来您希望这会神奇地发生,但事实并非如此。


在这段代码中:


func (t Toolbox) GetHammers() []HammerInterface  {

    return []HammerInterface{t.Hammers}

}

您可能期望返回的结果是 3 的一部分HammerInterface,但相反,您得到的是一个HammerInterface,它实际上是 3 的一部分Hammers。


您必须手动执行此转换。有关更多详细信息,请参阅此帖子。


func (t Toolbox) GetHammers() []HammerInterface  {

    hammerInterfaces := make([]HammerInterface, len(t.Hammers))

    for i, hammer := range t.Hammers {

        hammerInterfaces[i] = t.Hammers[i]

    }

    return hammerInterfaces

}

在大多数真实场景中,您的错误会被编译器捕获,因为您的 hammers ( t.Hammers) 片段不满足HammerInterface接口,但在您的情况下,由于该接口为空,因此它匹配任何类型interface{}。


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信