这是我创建的一个示例,我在其中声明了我的第一个结构,它是一个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{}。
- 1 回答
- 0 关注
- 104 浏览
添加回答
举报
0/150
提交
取消