ファイルを同時に書き込むための短いスクリプトを書きました。 1つのgoroutineは文字列をファイルに書き込むのに対し、他の人はチャネルを介してメッセージを送信することになっています。 しかし、いくつかの本当に奇妙な理由のために、ファイルが作成されますが、チャンネルを通じてメッセージが追加されません。Golang:チャネルと同時書き込み
package main
import (
"fmt"
"os"
"sync"
)
var wg sync.WaitGroup
var output = make(chan string)
func concurrent(n uint64) {
output <- fmt.Sprint(n)
defer wg.Done()
}
func printOutput() {
f, err := os.OpenFile("output.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666);
if err != nil {
panic(err)
}
defer f.Close()
for msg := range output {
f.WriteString(msg+"\n")
}
}
func main() {
wg.Add(2)
go concurrent(1)
go concurrent(2)
wg.Wait()
close(output)
printOutput()
}
printOutput()ゴルーチンは、実際にファイルに入るforループの後に何かを書き込もうとすると完全に実行されます。これは、範囲出力がnullになる可能性があると私に導きます。
あなたはコード例を修正することはできますか?書かれているように、それは動かないだろう。 – Snowman
@スノーマン確かに!私はちょっと時間を与えて、タイプ変数を変更します – Juanvulcano
@Snowman今のはるかに良くなっているはずです、https://play.golang.org/p/Cx6mcUHiSU – Juanvulcano