開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
Go Systems Programming: Master Linux and Unix system level programming with Go (渋川 よしき(著)、ごっちん(イラスト)、ラムダノート)、第3章(低レベルアクセスへの入り口2:io.Reader)、3.9(問題)、Q3.5(CopyN)の解答を求めてみる。
コード
package main
import (
"fmt"
"io"
"os"
"strconv"
)
func copyN(dest *os.File, src *os.File, length int64) (written int64, err error) {
b := make([]byte, length)
m, err := src.Read(b)
if err != nil {
return
}
n, err := dest.Write(b[:m])
written = int64(n)
if length > int64(m) {
err = io.EOF
return
}
return
}
func eprintln(err error) {
if err != nil {
fmt.Fprintln(os.Stdout, err)
os.Exit(1)
}
}
func main() {
var length int64
var err error
if len(os.Args) == 1 {
length = 10
} else {
n, err := strconv.Atoi(os.Args[1])
length = int64(n)
eprintln(err)
}
src, err := os.Open("main.go")
eprintln(err)
defer src.Close()
dest, err := os.Create("temp.go")
eprintln(err)
defer dest.Close()
written, err := copyN(dest, src, length)
eprintln(err)
fmt.Println("copyN length:", length, "written:", written)
}
入出力結果(Zsh、PowerShell、Terminal)
% go build
% ./copyn
copyN length: 10 written: 10
% cat temp.go
package ma% % ./copyn 100
copyN length: 100 written: 100
% cat temp.go
package main
import (
"fmt"
"io"
"os"
"strconv"
)
func copyN(dest *os.File, src *os.File, leng% % ./copyn 1000
EOF
% ./copyn 846
copyN length: 846 written: 846
% ./copyn 847
EOF
%
0 コメント:
コメントを投稿