ホームページ >バックエンド開発 >Golang >goroutineから複数の戻り値を読み取る

goroutineから複数の戻り値を読み取る

PHPz
PHPz転載
2024-02-09 12:30:091080ブラウズ

从 goroutine 读取多个返回值

php Editor Apple goroutine から複数の戻り値を読み取ることは、Go 言語では一般的な操作です。 Goroutine は、同時実行を実現できる Go 言語の軽量スレッドです。場合によっては、さらに処理するために 1 つ以上のゴルーチンから戻り値を取得する必要があります。この操作は、ゴルーチン間の通信のための重要なメカニズムであるチャネルを使用して実現できます。チャネルを通じて、ゴルーチン間でデータを受け渡し、コルーチン間の同期と通信を実現できます。この記事では、ゴルーチンから複数の戻り値を読み取る方法のヒントと考慮事項を詳しく説明します。

質問内容

Goでwc(1)を書こうとしており、ゴルーチンを使って大量の入力ファイルをより効率的に計算しようとしています。私のコードは正常に動作しますが、すべての go ルーチンの統計を要約する方法を実装するのに苦労しています。すべての go ルーチンの作業が終了した後、関数変数 nlnwnc を 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 変数を導入し、すべての結果を反復処理するときに、nlncnw# を追加するだけです。 ## がこの合計変数に追加されます。 リーリー

次のような内容が得られるはずです (3 つのファイルを含む):

リーリー

以上がgoroutineから複数の戻り値を読み取るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。