我要做的是创建一个interface
类型的片段,并用一些实现此接口的结构类型填充它。
chans := []chan Event {
make(chan FileEvent),
make(chan NetworkEvent),
}
但是cannot use make(chan FileEvent) (type chan FileEvent) as type chan Event in array or slice literal
失败了。
现在我知道这是meant to be that way 然而,建议的解决方案是a)不实用,因为我有一堆不同的类型,不能轻易迭代它们和b)我甚至无法让它工作,它仍然给我同样的错误。我试过了:
chans := make([]chan Event, 2)
chans[0] = make(chan FileEvent)
你们知道我做错了什么,或者如何优雅地解决这个问题?非常感谢!!
以下是类型的定义:
type Event interface {
GetId() string
}
type FileEvent struct {
}
func (e FileEvent) GetId() string {
return "FileEvent"
}
答案 0 :(得分:3)
Event
可能是接口类型,但chan Event
不是;它是一种特定的渠道类型。 []chan Event
是一个切片,其中每个元素必须是chan Event
类型。但是,chan Event
可以接受实施Event
的任何类型的消息。
为什么呢?请考虑以下代码:
chans := []chan Event {
make(chan FileEvent),
make(chan NetworkEvent),
}
ch := chans[0] // ch is of type chan Event because that's the type of elements of chans
ch <- NetworkEvent{} // Uh oh - we just tried to send a NetworkEvent to what's actually a chan FileEvent!
如果您的代码合法,send将是编译时合法的,但会导致运行时类型错误,Go中不允许这样做,因为它使用严格的静态类型。
然而,您可以将它们全部chan Event
,然后您可以发送所需的任何类型,并在从这些频道接收时使用类型断言。