Concurrency 没有看到goroutines预期的副作用

Concurrency 没有看到goroutines预期的副作用,concurrency,go,append,slice,goroutine,Concurrency,Go,Append,Slice,Goroutine,我正在努力了解戈罗季斯。以这个代码为例: 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 i

我正在努力了解戈罗季斯。以这个代码为例:

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以这种方式运行时,它会打印两个空切片。为什么这不起作用?

你开始的任何Goroutine都不能保证已经完成甚至开始!直到您使用、通道或其他机制明确等待它们:


不过,说到风格,如果是我的话,还有Go的代码审查评论。

你开始的任何Goroutine都不能保证已经完成甚至开始了!直到您使用、通道或其他机制明确等待它们:


说到风格,如果是我的话,还有Go的代码审查评论。

你启动的任何goroutine都不能保证完成,除非你使用sync.WaitGroup、channel或其他机制等待它。你启动的任何goroutine都不能保证完成,除非你使用sync.WaitGroup、channel或其他机制等待它。
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()
}