私のアプリを並列化するために私はthis postに従っています。私は完全にラインcase out <- n * n:
を理解していないgo中チャンネルの範囲を選択
func sq(done <-chan struct{}, in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for n := range in {
select {
case out <- n * n:
case <-done:
return
}
}
}()
return out
}
:私はこのコードを調整する必要があります。 n
の値がある場合は、それを四角形にしてチャンネルに送りますが、それはなぜわかりません。 select
ちょうど最初にtrue
ケースを取るか?それは書き換えることができます
for n := range in {
select {
case n:
out <- n * n
case <-done:
return
}
}
はとにかく、私は、関数呼び出しでラインcase out <- n * n:
を交換する必要があります。私は次のように変更しました:それはこのようになります
out := make(chan structs.Ticket)
go func() {
defer close(out)
for url := range inputChannel {
select {
case url:
data, err := GetData(url)
fmt.Println("Got error: ", err)
out <- data
case <-done:
return
}
}
}()
return out
がコンパイルされます(私はまだそれをコンパイルすることはできません)、それは、並列コードをデバッグするのは簡単ではありませんので、私はcase url
を使用していたことを確認したかったですrange
でチャンネルを選択するには正しい方法です。これは正しいですか?
更新
私は私のコードで、残りの問題を削除した、と今私がコンパイルしようとすると、私はエラーメッセージを取得OK:
url evaluated but not used
select case must be receive, send or assign recv
私はあなたが 'select'と' switch'ステートメントを混同していると思います。 'select'ケースはチャネル操作にのみ関係します – JimB