2014-05-01 44 views
1

目前,我有以下代碼:從不同的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

編輯:看來我要問目前尚不清楚。對於上面的例子,我的問題是,我將如何去同時改變兩個切片中每個切片的最後一個元素?

+0

我添加了一個編輯來闡明我所要求的東西。謝謝 – sSmacKk

回答

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) 
+0

謝謝,對我給的小例子有意義。但想象我們有超過2片處理,我不相信這種兩種方法會工作... – sSmacKk

+0

順便說一句:我必須承認我沒有編譯上述,所以可能是一個錯字的地方。 – miltonb

+0

有一個很好的演講,它涵蓋了Rob Pike帶有頻道的粉絲和粉絲。 talks.golang.org/2012/concurrency.slide。它有很多併發模式的例子,非常值得研究。 – miltonb