亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該如何聲明一個接口,該接口具有返回不同接口的一部分的方法?

我應該如何聲明一個接口,該接口具有返回不同接口的一部分的方法?

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 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號