2 回答
TA贡献1772条经验 获得超6个赞
将每个通道更改为struct通道可能在这里有效,但一般来说,您可能希望将您的struct类型视为用于处理的接口。幸运的是,go 给了我们很多解决方案。这是一个。
考虑这个非常简单的设置,我们希望使用Object结构类型作为多个接口:
// Get the objects
func ParseFile(fileName string, co chan Object) {
for _, object := range DoStuff(fileName) {
co <- object
}
}
// Use some saving functionality that is defined elsewhere as:
func Archive(cs chan Saveable) {
for saveable := range cs {
saveable.Save()
}
}
type Saveable interface {
Save()
}
//Implement the interfaces...
func (*Object) Save() {
fmt.Println("Naa, I'm lazy")
}
// Or some throwing functionality?
func ThrowOnTheWall(ct chan Throwable) {
for throwable := range cs {
throwable.Throw()
}
}
//...
co := make(chan Object)
go ParseFile("file.xml", co)
Archive(co) // Will NOT work, co is of the wrong type.
在这里,在任何地方使用 somechan Object是不合适的,因为您可能想将一些与对象不同的东西扔到墙上(例如,type Defecation struct {...}您也将实现为 a Throwable。)。
您可以使用 go 例程在后台进行转换:
func ObjectToSaveable(from chan Object) chan Saveable {
to := make(chan Saveable)
go func() {
for object := range from {
to <- &object
}
close(to)
}()
return to
}
然后用它来封装初始通道:
co := make(chan Object)
go ParseFile("file.xml", co)
Archive(ObjectToSaveable(co))
- 2 回答
- 0 关注
- 230 浏览
添加回答
举报