Go 无法使接口片段正常工作

Go 无法使接口片段正常工作,go,Go,我试图做的是创建一个接口类型的切片,并用一些实现这个接口的结构类型填充它 chans := []chan Event { make(chan FileEvent), make(chan NetworkEvent), } 但由于无法将makechan FileEvent类型chan FileEvent用作数组或切片文本中的类型chan Event,此操作失败 现在我意识到这是一个错误。 然而,建议的解决方案是不实用的,因为我有一堆不同的类型,不能轻易地迭代它们,我甚至不能让它工作

我试图做的是创建一个接口类型的切片,并用一些实现这个接口的结构类型填充它

chans := []chan Event {
    make(chan FileEvent),
    make(chan NetworkEvent),
}
但由于无法将makechan FileEvent类型chan FileEvent用作数组或切片文本中的类型chan Event,此操作失败

现在我意识到这是一个错误。 然而,建议的解决方案是不实用的,因为我有一堆不同的类型,不能轻易地迭代它们,我甚至不能让它工作,它仍然给我相同的错误。我试过:

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"
}
事件可以是接口类型,但chan事件不是;它是一种特定的通道类型。[]chan事件是一个切片,其中每个元素都必须是chan事件类型。但是,chan事件可以接受实现事件的任何类型的消息

为什么??考虑这个代码:

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!
如果您的代码是合法的,那么发送将是编译时合法的,但会导致运行时类型错误,这在Go中是不允许的,因为它使用严格的静态类型


但是,您可以将它们全部设置为chan Event,然后您可以发送所需的任何类型,并在从这些频道接收时使用类型断言。

请包含事件的定义。chan Event和chan FileEvent是不同的类型。如链接文档中所述,不能将一个分配给另一个。