2 回答
TA贡献1809条经验 获得超8个赞
我认为您不需要使用sync
,尽管我确定您可以提出一个可行的解决方案。我认为最简单的解决方案是:
为每个数据创建一个新通道。我不确定这会对性能产生影响,因此您可以对此进行一些检查。
将相同的输出通道发送到两种算法。
取下通道中的第一个值,看看是否喜欢它。
如果不这样做,则取第二个值。
继续,不用担心开放频道。我们正在进行垃圾收集。
像这样的东西:
type Result struct {
Value string
Algorithm string
}
func (r *Result) String() string {
return r.Value
}
func A(in string, out chan *Result) {
out <- &Result{"A", "A"}
}
func B(in string, out chan *Result) {
out <- &Result{"B", "B"}
}
func main() {
data := []string{"foo", "bar", "baz"}
for _, datum := range data {
resultChan := make(chan *Result, 2)
expectedResult := "B"
go A(datum, resultChan)
go B(datum, resultChan)
result := <-resultChan
if result.Value != expectedResult {
fmt.Println("Unexpected result: ", result)
result = <-resultChan
}
fmt.Println("Got result: ", result)
}
}
- 2 回答
- 0 关注
- 218 浏览
添加回答
举报