入出力をバイト単位や行単位で行いたいときには 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()
}
}