我想知道for循环中创建的通道是否可以与for循环同时运行的子程序互换使用?
伪代码:
for i := range Map {
channel := make(chan my_type, buff_size)
go subroutine(Map[i], channel)
}
func subroutine(name valueType, channel channelType) {
//stuff here
}
是否存在子程序(Map [0])的方式,例如,可以访问在forloop的另一次迭代期间创建的另一个通道,即子程序的通道(Map [1])?
背景:我目前正在开展一个项目,我必须模拟不同的细胞群。每个细胞都具有分裂/分化/等的能力。为了复制真实系统,不同的群体必须彼此同时运行。问题是我必须在处理不同的人口时插入/删除特定人口类型的单元格,这是渠道发挥作用的地方。我正在考虑同时运行人群,每个人都有一个相关的频道。这就是为什么我问我们是否可以使用在不同的for循环迭代中创建的通道。
我希望人们明白我在问什么。
谢谢!
编辑:我决定添加一些代码以支持我的上下文描述,其中包含解释不同元素的注释。我已经包含了频道,但我不知道它是否有效。我希望它有助于理解我正在尝试做的事情:
func main() {
//where envMap is a map[int]Population and Population is a struct
envMap := initialiseEnvironment(envSetupInfo)
//general simulation loop
for i := 0; i < 10; i++ {
//loop to go through all envMap elements in parallel
for eachKey := range envMap {
channel := make(chan type)
go simulateEnv(envMap[eachKey])
}
}
}
func simulateEnv(cellPopulation Population, channel chan) {
//each Population has a map[int]Cell where Cell is a struct with cell properties
cellMap := cellPopulation.cellMap
for eachCell := range cellMap {
go divisionTransition(eachCell, channel)
}
}
答案 0 :(得分:1)
假设地图的每个元素都是一个结构,您可以创建一个字段来保存对其他通道的引用。例如,如果您希望地图的每个元素都引用上一个频道,您可以执行以下操作:
// assumes that Map[whatever] is a struct with a "lastChan" field
var lastRef = chan my_type
for i := range Map {
channel := make(chan my_type, buff_size)
if(lastRef != nil){
Map[i].lastChan = lastRef
}
go subroutine(Map[i], channel)
lastRef = channel
}
func subroutine(name valueType, channel channelType) {
//stuff here can access the previous channel with name.lastChan
}
根据您想要做什么以及您需要访问哪些频道,您可能希望使用循环或甚至做多个循环。