php Editor Apple goroutine から複数の戻り値を読み取ることは、Go 言語では一般的な操作です。 Goroutine は、同時実行を実現できる Go 言語の軽量スレッドです。場合によっては、さらに処理するために 1 つ以上のゴルーチンから戻り値を取得する必要があります。この操作は、ゴルーチン間の通信のための重要なメカニズムであるチャネルを使用して実現できます。チャネルを通じて、ゴルーチン間でデータを受け渡し、コルーチン間の同期と通信を実現できます。この記事では、ゴルーチンから複数の戻り値を読み取る方法のヒントと考慮事項を詳しく説明します。
Goでwc(1)を書こうとしており、ゴルーチンを使って大量の入力ファイルをより効率的に計算しようとしています。私のコードは正常に動作しますが、すべての go ルーチンの統計を要約する方法を実装するのに苦労しています。すべての go ルーチンの作業が終了した後、関数変数 nl
、nw
、nc
を main に渡し、そこで集約するにはどうすればよいでしょうか?
package main import ( "bufio" "fmt" "os" "strings" ) func main() { ch := make(chan string) for _, arg := range os.Args[1:] { go wc(arg, ch) } for range os.Args[1:] { fmt.Println(<-ch) } // Todo: summarize results... } func wc(arg string, ch chan<- string) { nl, nw, nc := 0, 0, 0 file, err := os.Open(arg) if err != nil { fmt.Println("Can't open file: %v", err) } defer file.Close() scan := bufio.NewScanner(file) for scan.Scan() { nl++ line := scan.Text() words := bufio.NewScanner(strings.NewReader(line)) words.Split(bufio.ScanWords) for words.Scan() { nw++ } runes := bufio.NewReader(strings.NewReader(line)) for { if _, _, err := runes.ReadRune(); err != nil { break } else { nc++ } } } ch <- fmt.Sprintf("%8d%8d%8d", nl, nw, nc+nl) }
答えはもうすぐです!数値を含む Result
オブジェクトを返す簡単なリファクタリングをお勧めします。これにより、(文字列を使用する代わりに) 最後に数値を簡単に追加できるようになります。したがって、chan string
の代わりに chan result
を使用できます。
基本的には、totalResult
変数を導入し、すべての結果を反復処理するときに、nl
、nc
、nw# を追加するだけです。 ## がこの合計変数に追加されます。
リーリー
リーリー
以上がgoroutineから複数の戻り値を読み取るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。