2 回答
TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
切片包含指向支持?jǐn)?shù)組的指針。當(dāng)您通過(guò)通道發(fā)送切片時(shí),您發(fā)送的是對(duì)該支持?jǐn)?shù)組的引用,因此在接收端,即使您多次讀取切片,您實(shí)際上也引用了同一個(gè)共享支持?jǐn)?shù)組。
您可以為每次迭代創(chuàng)建一個(gè)新切片并將其發(fā)送。每個(gè)切片都有一個(gè)單獨(dú)的后備數(shù)組,并且將按您的預(yù)期工作。
TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
稍微修改您的程序以便更好地閱讀。
package main
import "fmt"
import "sync"
func producer(jobs chan []int, wg *sync.WaitGroup) {
defer wg.Done()
a := make([]int, 2)
a[0] = 1
a[1] = 2
jobs <- a //We are passing memory location of slice ( is nature of slice ), so the values changing next line will affect here too
a[0] = 2
a[1] = 3
jobs <- a
close(jobs)
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
jobs := make(chan []int, 2)
go producer(jobs, &wg)
for job := range jobs {
fmt.Printf("job: %+v\n", job)
}
wg.Wait()
}
我用 Array 嘗試過(guò)的相同程序,然后我們將得到您期望的結(jié)果,請(qǐng)參見(jiàn)下面的代碼
package main
import "fmt"
import "sync"
func producer(jobs chan [2]int, wg *sync.WaitGroup) {
defer wg.Done()
var a[2]int
a[0] = 1
a[1] = 2
jobs <- a
a[0] = 2
a[1] = 3
jobs <- a
close(jobs)
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
jobs := make(chan [2]int)
go producer(jobs, &wg)
for job := range jobs {
fmt.Printf("job: %+v\n", job)
}
wg.Wait()
}
- 2 回答
- 0 關(guān)注
- 131 瀏覽
添加回答
舉報(bào)
