来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《将接口切片向下转换为子接口切片》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
问题内容我正在尝试更好地使用 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
}
这是错误: 无法在参数 initializeall
中使用主机(类型 []host)作为类型 []initialized。
我最初的想法是我缺少某种类型的向下转型,我知道它适用于单个接口对象,但很难转换数组。当我尝试执行 err := initializeall(hosts.([]initializable))
时,出现以下错误: invalid typeassertion:hosts.([]initializable) (non-interface type []host on left)
.
我很感激有关此代码示例的设计的任何想法,也许还有有关正确语法或我可以做的一些重构来解决此问题的任何建议。谢谢!
解决方案
我似乎无法弄清楚该应用程序使用的正确语法
没有这样的语法。您根本无法(直接)执行此操作。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。