从不同的goroutine访问频道

时间:2014-05-01 06:45:41

标签: concurrency go channel goroutine

我目前有以下代码:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

var channel = make(chan []float32, 1)

func main() {
    aMap := initMap()

    for key := range aMap {
        fmt.Print("the iteration number is: ", key)

        theSlice := aMap[key]
        channel <- theSlice
        go transition(channel)
        time.Sleep(2 * time.Second)

    }
}

func transition(channel chan []float32) {
    newSlice := make([]float32,5)
    newSlice = <- channel
    fmt.Println(newSlice)

    //need to retrieve the last element of the other slice and put it on this newSlice
}

func initMap() map[int][]float32 {
    aMap := make(map[int][]float32)
    for i := 0; i < 2; i++ {
        aMap[i] = []float32{rand.Float32(), rand.Float32(), rand.Float32(), rand.Float32(), rand.Float32()}
    }
    return aMap
}

我们有一个带有两个切片的地图,我想要做的是取slice1的最后一个元素并使其成为slice2的最后一个元素,反之亦然。

我实际上正在开展一个更大的项目,涉及模拟细胞的分裂和分化。自模拟以来,所有的划分和差异都在同一时间进行。问题在于分化,其中类型A的细胞被转化为B型细胞。每种类型的单元存储在不同的数据结构中,我认为我可以为每个不同的数据结构使用一个通道,并使用通道同时更改数据。

希望这是有道理的。有什么建议吗?

谢谢, CJ

编辑:看来我问的不清楚。我对上面这个例子的问题是,我将如何同时互换两个切片中每个切片的最后一个元素?

1 个答案:

答案 0 :(得分:1)

频道是双向的,是关于沟通,而不是共享内存。因此,也许不是发送整个切片,而是将每个切片中的最后一个项目向下发送到通道,然后以另一种方式发送第二个值。

  func main() {

    ...
    // send only the last item
    theSlice := aMap[key]
    channel <- theSlice[len(theSlice)-1]
    // waiting for the response
    theSlice[len(theSlice)-1] = <- channel
  }

  func transition(channel chan []float32) {
    newSlice := make([]float32,5)
    channel <- newSlice[len(newSlice)-1]
    newSlice[len(newSlice)-1] = <- channel
    fmt.Println(newSlice)
 }

上面的代码确实假设通道声明已从切片更改为只是一个float32:

 var channel = make(chan float32, 1)