scannerで読み込んだ行を並列でjson.Unmershalすると壊れる

golang歴4時間です。

1行1JSONなファイルを処理するため、以下のようなコードをかいたところjson.Unmarshalでエラーになりました。

func main() {
    scanner := bufio.NewScanner(os.Stdin)

    ch := make(chan bool, 3)

    var wg sync.WaitGroup
    for scanner.Scan() {
        line := scanner.Bytes()

        wg.Add(1)
        ch <- true
        go func(line []byte) {
            defer func() {
                wg.Done()
                <-ch
            }()

            var hoge Hoge
            jsonErr := json.Unmarshal(line, &hoge)
            if jsonErr != nil {
                log.Print(jsonErr)
            }
        }(line)
    }
    wg.Wait()
}

goroutineを使わなければ問題ないんですよね。scanner.Bytesで取得した[]byteの値はスレッド間で共有されてjson解析中に書き換わってしまうのでしょうか…。

   for scanner.Scan() {
        b := scanner.Bytes()
        line := make([]byte, len(b))
        copy(line, b)

取得した値をコピーしてやれば大丈夫でした。