【发布时间】:2018-11-09 14:20:20
【问题描述】:
在使用 C# 编程多年后,我最近开始编写 Go,但我很难理解该语言的几个概念。这是我试图解决的一个例子:我希望能够创建一个迭代列表、调用函数并将输出存储在缓冲通道中的例程。问题是我想返回这些输出值的 distinct 集,因为该函数可以为列表中的两个不同元素返回相似的结果。
由于 Go 没有内置的集合类型,我正在尝试使用 map[string]bool 来存储不同的值(使用 map[string]bool 或 map[string]struct 是其他人建议作为集合的替代品) ;我正在使用缓冲通道插入此地图,但是我不确定将 1 个元素插入地图的正确语法是什么样的。这是我正在尝试做的事情:
resultsChnl := make(chan map[string]bool, len(myList))
go func(myList []string, resultsChnl chan map[string]bool) {
for _, item := range myList {
result, err := getResult(item)
/* error checking */
resultsChnl <- {result: true}
}
close(resultsChnl)
}(myList, resultsChnl)
for item := range resultsChnl {
...
}
显然,由于resultsChnl <- {result: true} 的语法无效,这无法编译。我知道这听起来不切实际,因为在这种特殊情况下,我自然可以在 for 循环中创建一个本地映射,并将一个 map[string]bool 对象分配给一个非缓冲通道并返回它,但假设我正在为每个项目创建一个 go 例程在列表中并且真的想使用缓冲通道(而不是使用互斥锁来获取共享映射上的锁)。那么有没有办法在地图通道中插入一个键值对呢?还是我认为这完全错误?
【问题讨论】:
-
如果值只是一个哨兵,那么只有一个条目的地图是没有意义的。但是,从问题来看,您需要将切片转换为集合(即 map[string]bool),然后然后将地图发送到通道中。