Go言語らしくない題材だとは思いますが、練習に行単位のI/O処理を書いてみました。
// my_cat.go
package main
import (
"fmt"
"os"
"bufio"
)
func main() {
if len(os.Args) <= 1 {
fmt.Fprintf(os.Stderr, "Usage: my_cat file\n")
os.Exit(1)
}
f,err := os.Open(os.Args[1], os.O_RDONLY, 0666)
if err != nil {
fmt.Fprintf(os.Stderr,"ERROR: %s\n", err.String())
os.Exit(1)
}
reader := bufio.NewReader(f)
writer := bufio.NewWriter(os.Stdout)
// writer,err := bufio.NewWriterSize(os.Stdout, 4096)
for {
line,err := reader.ReadString('\n')
if err != nil {
break
}
writer.WriteString(line)
}
writer.Flush()
f.Close()
return
}
bufio.NewWriterSize で書き込みバッファサイズを指定することもできますが、わたしの環境の場合には、デフォルトで 4096 バイトぐらいのようです。次のように、少々ぶれます。
[user00@fedora14 ~]$ strace -e write ./my_cat /etc/init.d/functions >/dev/null
write(1, "# -*-Shell-script-*-\n#\n# functio"..., 4094) = 4094
write(1, "\t\t\t\taction $\"Detaching loopback "..., 4067) = 4067
write(1, " [ \"$BOOTUP\" = \"v"..., 4092) = 4092
write(1, "# Log that something succeeded\ns"..., 4080) = 4080
write(1, "\t# Parse the options field, conv"..., 2837) = 2837
0 件のコメント:
コメントを投稿