【发布时间】:2017-10-27 10:15:25
【问题描述】:
我有一个函数,它接收一个字符串,并基于它创建一个基于字符串值的类型的通道。然后发送该通道以填充到另一个线程中。
在这个函数中,我想范围覆盖填充的值并使用它们。
但是,我收到一个错误:“cannot range over myChan (type interface {})”
这是我的代码示例:
func myFunc(input string) {
var myChan interface{}
switch input {
case "one":
myChan = make(chan One)
case "two":
myChan = make(chan Two)
}
go doStuff(&myChan)
for _, item := range myChan {
fmt.Println(item)
}
}
请帮助我了解如何完成此操作?
编辑:对不起,我的问题不够清楚。 go doStuff(&myChan) 这行其实是这样的:
go gocsv.UnmarshalToChan(clientsFile, &myChan)
根据 gocsv UnmarshalToChan 的文档“通道必须具有具体类型。”这就是为什么我不能拥有 chan 界面{}
【问题讨论】:
-
这样不行。它可以像 myChan 是“chan interface{}”一样工作。但更好的是创建不使用 interface{} 的通道,而是使用具有某些特定方法的接口通道。请告诉我们你为什么需要这样的东西,因为我从来不需要创建一个频道,我不知道它是什么。
-
我收到一个 csv 文件名。不同的文件内部会有不同的结构。然后我将它发送到 gocsv.UnmarshalToChan(clientsFile, &myChan)。 gocsv 是 "github.com/gocarina/gocsv" 在范围内也不会只是 println,我会做一些处理并将其写入 db。
-
您能否将处理和写入数据库代码作为类型的方法包含在内?喜欢
Two.Process()和Two.WriteDB(dbHandle)?如果你能像这样隔离它们的行为,你可以使通道成为一个带有这些方法的接口,并且范围循环可以简单地接受任何满足它的东西,在它们从通道中获取项目时调用这些方法。这也会将代码开放给依赖注入测试,因为硬编码的具体类型会使正确的单元测试变得困难或不可能。