我正在尝试了解 goroutines。拿这个代码:package mainimport "fmt"var ( b1 []float64 b2 []float64)func main() { go fill(&b1, 10) go fill(&b2, 10) fmt.Println(b1,b2) var s string fmt.Scanln(&s)}func fill(a *[]float64, n int) { for i:=0; i<n; i++ { *a = append(*a, rand.Float64()*100) }}如您所见,我正在尝试填充两个切片。但是当以这种方式运行时(使用go fill()),它会打印两个空切片。为什么这不起作用?
1 回答
largeQ
TA贡献2039条经验 获得超7个赞
在您使用sync.WaitGroup、通道或其他机制明确等待它们之前,您启动的任何 goroutine 都不能保证已经完成(甚至开始!)。这有效:
package main
import (
"fmt"
"math/rand"
"sync"
)
var (
b1 []float64
b2 []float64
)
func main() {
wg := new(sync.WaitGroup)
wg.Add(2)
go fill(&b1, 10, wg)
go fill(&b2, 10, wg)
wg.Wait()
fmt.Println(b1)
fmt.Println(b2)
}
func fill(a *[]float64, n int, wg *sync.WaitGroup) {
for i := 0; i < n; i++ {
*a = append(*a, rand.Float64()*100)
}
wg.Done()
}
(只是说话的风格,如果是我的话我会想办法让这个函数返回扩大切片所以它类似于append()本身,而Go的代码审查意见建议传递价值观,但在所有非常规的它不是延长为指针经过切片接收器(“这个”)参数。)
- 1 回答
- 0 关注
- 192 浏览
添加回答
举报
0/150
提交
取消