将接口切片向下转换为子接口切片

我试图更好地使用 Go 中的接口来描述特定的功能,并使用接口组合来编写更好、更易于理解的代码。我遇到了这个问题,这似乎是 go 接口的一个常见用例,但我似乎无法找出用于此应用程序的正确语法。这里有一些代码可以帮助解释我正在尝试做的事情:


// Initializable is an interface to an object that can be initialized.

type Initializable interface {

    Initialize() error

}


// InitializeAll initializes an array of members.

func InitializeAll(members []Initializable) error {

    for _, member := range members {

        err := member.Initialize()

        if err != nil {

            return err

        }

    }

    return nil

}


// Host is an interface to an object providing a set of handlers for a web host.

type Host interface {

    Initializable

    Hostname() string

    RegisterHandlers(router *mux.Router)

}


// ConfigureHosts configures a set of hosts and initializes them.

func ConfigureHosts(hosts []Host) (*mux.Router, error) {

    err := InitializeAll(hosts) // compiler error here

}

这是错误:cannot use hosts (type []Host) as type []Initializable in argument InitializeAll。


我最初的想法是我缺少某种向下转换的类型,我知道它适用于单个接口对象,但很难转换数组。当我尝试做err := InitializeAll(hosts.([]Initializable))时,我收到以下错误:invalid type assertion: hosts.([]Initializable) (non-interface type []Host on left)。


对于此代码示例的设计,我很感激任何想法,也许还有关于正确语法或我可以做一些重构来解决这个问题的任何建议。谢谢!


拉风的咖菲猫
浏览 211回答 1
1回答

翻过高山走不出你

我似乎无法弄清楚用于此应用程序的正确语法没有这样的语法。您根本无法(直接)执行此操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go