没有看到 goroutines 的预期副作用

我正在尝试了解 goroutines。拿这个代码:


package main

import "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()),它会打印两个空切片。为什么这不起作用?


尚方宝剑之说
浏览 193回答 1
1回答

largeQ

在您使用sync.WaitGroup、通道或其他机制明确等待它们之前,您启动的任何 goroutine 都不能保证已经完成(甚至开始!)。这有效:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "math/rand"&nbsp; &nbsp; "sync")var (&nbsp; &nbsp; b1 []float64&nbsp; &nbsp; b2 []float64)func main() {&nbsp; &nbsp; wg := new(sync.WaitGroup)&nbsp; &nbsp; wg.Add(2)&nbsp; &nbsp; go fill(&b1, 10, wg)&nbsp; &nbsp; go fill(&b2, 10, wg)&nbsp; &nbsp; wg.Wait()&nbsp; &nbsp; fmt.Println(b1)&nbsp; &nbsp; fmt.Println(b2)}func fill(a *[]float64, n int, wg *sync.WaitGroup) {&nbsp; &nbsp; for i := 0; i < n; i++ {&nbsp; &nbsp; &nbsp; &nbsp; *a = append(*a, rand.Float64()*100)&nbsp; &nbsp; }&nbsp; &nbsp; wg.Done()}(只是说话的风格,如果是我的话我会想办法让这个函数返回扩大切片所以它类似于append()本身,而Go的代码审查意见建议传递价值观,但在所有非常规的它不是延长为指针经过切片接收器(“这个”)参数。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go