2020年7月17日金曜日

開発環境

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 コメント:

コメントを投稿