我已阅读了
CommonMistakes以及通过-race标志运行我的代码,但我似乎无法确定这里的错误:
package main
import (
"fmt"
)
func main() {
i := 1
totalHashFields := 6
for i <= totalHashFields {
Combinations(totalHashFields, i, func(c []int) {
fmt.Println("Outside goroutine:", c)
go func(c []int) {
fmt.Println("Inside goroutine:", c)
}(c)
})
i++
}
}
func Combinations(n, m int, emit func([]int)) {
s := make([]int, m)
last := m - 1
var rc func(int, int)
rc = func(i, next int) {
for j := next; j < n; j++ {
s[i] = j
if i == last {
emit(s)
} else {
rc(i+1, j+1)
}
}
return
}
rc(0, 0)
}
(对于那些感兴趣的人,组合功能是组合algo)
以下是fmt.Println的一些输出:
Outside goroutine: [0 1 4]
Inside goroutine: [5 5 5]
Outside goroutine: [0 1 2 3 4 5]
Inside goroutine: [5 5 5 5 5 5]
基本上,即使我将c作为参数传递给我的匿名go函数,该值也始终与此范围之外的值不同.在上面的输出中,我预计2“内部”值也分别为[0 1 4]和[0 1 2 3 4 5].
最佳答案 问题是你在distinc int slice上做了很多工作,但是这些共享一个共同的支持数组:完成组合之后,切片将满5秒.你的c in main与s共享底层支持数组.
但是你的goroutines在组合完成后才开始执行,所以一旦它们启动,它将看到s的最终值,它只是5s.
在这里传递切片并没有像你所做的那样,因为这会产生c的正确副本而不是支持数组.
尝试
Combinations(totalHashFields, i, func(c []int) {
fmt.Println("Outside goroutine:", c)
cpy := make([]int, len(c))
copy(cpy, c)
go func(c []int) {
fmt.Println("Inside goroutine:", c)
}(cpy)
})
做一个c的“深层复制”.