問題

私は高速実行を行うためにgoルーチンを使用しています。私は練習のためのサンプルプログラムを作っていますが、goルーチンに割り当てた後に変数の値が空であることがわかりました。私は自分のコードを表示しています:

 package main

import (
    "fmt"
)

func main() {
    var collectInt []int
    doneChan := make(chan string)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt = append(collectInt, i)
        }

    }()
    fmt.Println(collectInt)
    go func() {
        doneChan <- "done"
    }()
    <-doneChan
}
 

プレイリンク https://play.golang.org/p/VgwrzR8GBzN

goルーチンの使用中に変数に値を割り当てる方法を教えてください。

  ベストアンサー

この規則は、共有変数とデータを共有するのではなく、goルーチン間でチャネルを使ってデータを渡すことです。

Goことわざを参照してください

メモリを共有してメモリを共有することで通信しないでください。

collectIntをチャンネルにして、各intを個別に渡します。

 package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt <- i
        }
        close(collectInt)
    }()
    for i := range collectInt {
        fmt.Println(i)
    }
}
 

または、チャンネルでデータセット全体を渡します。

 package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan []int)
    go func() {
        var ints []int
        for i := 0; i < 10; i++ {
            ints = append(ints, i)
        }
        collectInt <- ints
    }()
    fmt.Println(<-collectInt)
}
 

この場合、doneChanは使用しません。

  同じタグがついた質問を見る

goroutines