为了账号安全,请及时绑定邮箱和手机立即绑定

没有看到 goroutines 的预期副作用

没有看到 goroutines 的预期副作用

Go
尚方宝剑之说 2021-09-27 21:23:21
我正在尝试了解 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的代码审查意见建议传递价值观,但在所有非常规的它不是延长为指针经过切片接收器(“这个”)参数。)


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信