/* Want to write from os.Stdin to os.Stdout(fmt.Println() in below code) using channels*/
package main
import (
"fmt"
"io"
"os"
"bufio"
)
type message []byte
/* Function to run the groutine to run for stdin read */
func read (r io.Reader) <-chan message{
lines := make (chan message)
go func() {
defer close(lines)
scan := bufio.NewScanner(r)
for scan.Scan() {
lines <- message(scan.Bytes())
}
}()
return lines
}
func main() {
mes := make (chan message, 1)
sig := make (chan bool)
ch := read (os.Stdin) //Reading from Stdin
for {
select {
case anu := <-mes:
fmt.Println("Message to stdout")
fmt.Println(string(anu)) //Writing to Stdout
case mes <- <-ch:
fmt.Println("Message to channel 2")
continue
}
}
<-sig
/*
The O/P is :
go run writetochan.go
Golang
Message to channel 2
Fun <<< Delayed O/P golang means after putting one more
message only we are getting First message
Message to stdout
Golang
Expected O/P:
go run writetochan.go
Golang
Message to channel 2
Message to stdout
Golang
Fun
Message to channel 2
*/
}
上記のO/Pを達成したいですか?チャンネルを使用してos.Stdinからos.Stdoutに書きたい
ユーザーからのすべてのstdinを読み込んでstdoutに書き込む1つのチャネルから書き込みを行っています。 goroutineでチャンネルの読み込みが行われています。ダミーチャネルが形成され(sig)、私たちは無期限に実行することができます(今のところ)。
私は、これは宿題ですね? – Flimzy
bufio.Scannerで使用されているスライスを共有することはできません。ドキュメントから: '基本配列は、後続の呼び出しで上書きされるデータを指すことがあります。 ' – JimB
' gofmt'を使用してください。私は、行き過ぎたWRTコーディングスタイルのためにかなりの批判を受けることを知っていますが、あなたのコードの見た目は、golang標準フォーマットに慣れたpplを読むのが難しくなります。 'sig:= make(chan bool)'や 'select-case'ブロックの余分なインデントレベルは、そこには存在しないはずです。 –