"set" 类型的频道
Channel of type "set"
在使用 C# 编程多年之后,我最近开始编写 Go,我很难理解该语言的几个概念。下面是我要解决的问题的一个示例:我希望能够创建一个例程来遍历列表、调用函数并将输出存储在缓冲通道中。问题是我想要 return 这些输出值的 distinct 集,因为该函数可以 return 列表中两个不同元素的相似结果。
由于 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
对象分配给一个非缓冲通道和 return,但让我们假设我正在创建列表中每个项目的 go 例程,并且真的想使用缓冲通道(而不是使用互斥锁来获取共享地图上的锁)。那么有什么办法可以在map通道中插入一对键值对呢?还是我的想法完全错了?
要直接回答问题,您需要
resultsChnl <- map[string]bool{result: true}
但这似乎一点用处都没有。您可能想要 收集 地图中的结果,但是当您知道它只有一个元素时,没有理由通过通道为每个结果传递地图。只需使用 string
的频道,执行
resultsChnl <- result
对于您的生产者协程中的每个结果,并且
seenResult[item] = true
在您的消费者循环中收集结果(其中 seenResult
是 map[string]bool
)。
或者完全忘记通道,让你的生产者 goroutines 直接写入 sync.Map。
在使用 C# 编程多年之后,我最近开始编写 Go,我很难理解该语言的几个概念。下面是我要解决的问题的一个示例:我希望能够创建一个例程来遍历列表、调用函数并将输出存储在缓冲通道中。问题是我想要 return 这些输出值的 distinct 集,因为该函数可以 return 列表中两个不同元素的相似结果。
由于 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
对象分配给一个非缓冲通道和 return,但让我们假设我正在创建列表中每个项目的 go 例程,并且真的想使用缓冲通道(而不是使用互斥锁来获取共享地图上的锁)。那么有什么办法可以在map通道中插入一对键值对呢?还是我的想法完全错了?
要直接回答问题,您需要
resultsChnl <- map[string]bool{result: true}
但这似乎一点用处都没有。您可能想要 收集 地图中的结果,但是当您知道它只有一个元素时,没有理由通过通道为每个结果传递地图。只需使用 string
的频道,执行
resultsChnl <- result
对于您的生产者协程中的每个结果,并且
seenResult[item] = true
在您的消费者循环中收集结果(其中 seenResult
是 map[string]bool
)。
或者完全忘记通道,让你的生产者 goroutines 直接写入 sync.Map。