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)
取得した値をコピーしてやれば大丈夫でした。