35304


例えば、

[code]

    $ A | B | C
    
[/code]

というパイプがあったととして

A の 標準出力を B で処理しつつ C にも渡したい場合  
Bのソースコード内に

[code]

    go io.Copy(os.Stdout, os.Stdin)
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
      txt := scanner.Text()
      // txt を処理
    }
    
[/code]

のようなことはできないのでしょうか？  
上記のようにプログラミングすると、どちらか片方に出力されるようです。


CC BY-SA 3.0
2017-05-13T06:12:43.417
34678
2017-06-05T09:48:43.697
18863
question
windows go
golang でパイプで渡された標準入力を次のパイプに渡したい


既にコメント欄で解決している様ですが、知見を残す為に。io.TeeReader を使うと Read 時に第一引数の Reader
から読み取られ、読み取ったバッファが第二引数の Writer に書きだされ、呼び出し元にもバッファが返されます。

[code]

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "log"
        "os"
    )
    
    func main() {
        r := io.TeeReader(os.Stdin, os.Stdout)
        scanner := bufio.NewScanner(r)
        for scanner.Scan() {
            fmt.Println(scanner.Text())
        }
        if err := scanner.Err(); err != nil {
            log.Fatal(err)
        }
    }
    
[/code]

質問の様に io.Copy で実装する場合、`io.Pipe` と `io.MultiWriter` を使う必要があります。

[code]

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "os"
    )
    
    func main() {
        r, w := io.Pipe()
        go func() {
            defer w.Close()
            io.Copy(io.MultiWriter(w, os.Stdout), os.Stdin)
        }()
    
        scanner := bufio.NewScanner(r)
        for scanner.Scan() {
            fmt.Println(scanner.Text())
        }
    }
    
[/code]

※エラー処理が必要です。


CC BY-SA 3.0
2017-06-05T09:48:43.697
35304
2017-06-05T09:48:43.697
440
34678
answer