gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:25:41 27 4
gpt4 key购买 nike

这是我创建的一个示例,我在其中声明了我的第一个结构,它是一个包含 slice HammersToolbox。我为 ToolboxHammer 制作了一个接口(interface),这样其他人就可以使用我的函数而不必使用我的结构,只要他们遵循我的接口(interface)实现即可。

package main

import "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 
3
1

我已经尝试了不同的变体,但我觉得有点卡住了。我不明白为什么它返回 1,但我怀疑我以错误的方式声明了我的接口(interface)方法。

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

最佳答案

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

在这段代码中:

func (t Toolbox) GetHammers() []HammerInterface  {
return []HammerInterface{t.Hammers}
}

您可能期望返回的结果是 3 个 HammerInterface 的 slice ,但相反,您得到的是一个 HammerInterface,这实际上是一个 slice 三个锤子

您必须手动进行此转换。参见 this post了解更多详情。

func (t Toolbox) GetHammers() []HammerInterface  {
hammerInterfaces := make([]HammerInterface, len(t.Hammers))
for i, hammer := range t.Hammers {
hammerInterfaces[i] = t.Hammers[i]
}
return hammerInterfaces
}

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

关于go - 我应该如何声明一个接口(interface),该接口(interface)具有返回不同接口(interface)的一部分的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55077743/

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