无法获得切片的工作

时间:2018-05-23 17:22:14

标签: go

我要做的是创建一个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"
}

1 个答案:

答案 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,然后您可以发送所需的任何类型,并在从这些频道接收时使用类型断言。