次のコードは、時々2を出力します。待機グループがすべてのゴルーチンが完了するのを待っているのはなぜですか?なぜこのWaitGroupはすべてのゴルーチンを待たないのですか?
type Scratch struct {
//sync.RWMutex
Itch []int
}
func (s *Scratch) GoScratch(done chan bool, j int) error {
var ws sync.WaitGroup
if len(s.Itch) == 0 {
s.Rash = make([]int, 0)
}
for i := 0; i < j; i++ {
ws.Add(1)
go func (i int) {
defer ws.Done()
s.Rash = append(s.Rash, i)
}(i)
}
ws.Wait()
done<- true
return nil
}
func main() {
done := make(chan bool, 3)
s := &Scratch{}
err := s.GoScratch(done, 3)
if err != nil {
log.Println("Error:%v",err)
}
<-done
log.Println("Length: ", len(s.Rash))
}`
奇妙なことに、私はmain関数で2を出力することはできませんが、テストケースを使用すると、時々2が出力されます。
どのように私はそれを逃したのか分からない - 休憩を取る必要があります。ありがとう、 – Sridhar
スライスでミューテックスを使用する代わりに、バッファリングされたチャネルを使用することもできます。 https://play.golang.org/p/CGdz4T2Qn5 – Billy