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

PHPz
リリース: 2024-02-09 12:30:09
転載
1054 人が閲覧しました

从 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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!