我目前有以下代码:
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 :(得分: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)