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

  • 本文关键字:接口 切片 转换 go
  • 更新时间 :
  • 英文 :


我试图更好地使用 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)

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

我似乎无法找出用于此应用程序的正确语法

没有这样的语法。您根本无法(直接(执行此操作。

最新更新