入出力をバイト単位や行単位で行いたいときには bufio
パッケージの関数が便利。リーダーやライターを作ってから、入出力関数を呼び出す。
バイト単位には、ReadByte
、WriteByte
がいい。
package main import ( "os" "io" "bufio" ) func main() { r := bufio.NewReader(os.Stdin) w := bufio.NewWriter(os.Stdout) for { c, err := r.ReadByte() if err == io.EOF { break } w.WriteByte(c) if c == '\n' { w.Flush() } } w.Flush() }
10行目と11行目でリーダーとライターを作って、それを使っている。
^o^ > go build echo1.go ^o^ > echo1.exe < echo1.go package main import ( "os" "io" "bufio" ) func main() { r := bufio.NewReader(os.Stdin) w := bufio.NewWriter(os.Stdout) for { c, err := r.ReadByte() if err == io.EOF { break } w.WriteByte(c) if c == '\n' { w.Flush() } } w.Flush() }
もうひとつ、行単位で処理するには、同じリーダー、ライターの ReadString
、WriteString
が使える。
package main import ( "os" "io" "bufio" ) func main() { r := bufio.NewReader(os.Stdin) w := bufio.NewWriter(os.Stdout) for { s, err := r.ReadString('\n') if err == io.EOF { break } w.WriteString(s) w.Flush() } }
^o^ > go build echo2.go ^o^ > echo2.exe < echo2.go package main import ( "os" "io" "bufio" ) func main() { r := bufio.NewReader(os.Stdin) w := bufio.NewWriter(os.Stdout) for { s, err := r.ReadString('\n') if err == io.EOF { break } w.WriteString(s) w.Flush() } }