1
私は、文字列を受け取るチャンネルをとるゴルーチンのループを作ろうとしており、受信するたびにその値を別の文字列に追加する必要があります。すべてのgoroutinesの最後で(ゴルーチンのカウントは、渡されたlist
の長さでなければなりません)、コードを続けてください。チャンネル受信機をとり、チャンネルに文字列を送るゴルーチン
以下の例では、strReceiver
チャネルの値をstr
に追加していないようです。strは変更されていないためです。
何が問題なのですか?
func appendToStr(str string, list []string, origin *url.URL) {
var currProc int32 = 0;
var maxProc int32 = int32(len(list))
var strReceiver := make(chan string, len(list))
for _, item := range list {
go func() {
doAsyncAndIncrement(item, strReceiver, &currProc)
str += <-strReceiver
}()
}
for {
if atomic.LoadInt32(&currProc) <= maxProc {
break;
}
}
// continue on using 'str' which now contains the append values from the 'strReceiver' channel
}
func doAsyncAndIncrement(item string, receiver chan<- string, count *int32) {
defer atomic.AddInt32(count, 1)
var val string
// do something with 'item' and set 'val'...
receiver <- val
}
申し訳ありませんが、それは私の誤植です。非同期関数は本当にその受信機に入るべきです。コードを更新しました。 – Lansana
'atomic.LoadInt32(&currProc)<= maxProc'この条件は否定してはいけませんか? currProcは、生成されたgoroutinesが実行するチャンスを取る前であっても、最初の繰り返しで中断します – nvartolomei