猿问

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

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


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 但我怀疑我以错误的方式声明了我的接口方法。


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


LEATH
浏览 105回答 1
1回答

www说

您的接口定义没有任何问题。问题是您没有正确转换[]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{}。
随时随地看视频慕课网APP

相关分类

Go
我要回答