入出力

標準入出力とファイル入出力関連。

関連項目

特に、ファイル入出力に関するもの:

参考:

テキストの読取り

空白区切りのテキストを読み取る

半角スペースやタブ区切りの文字列を読み取るとき。

  • フィールド数が固定なら fmt.Scan 系の関数が使える
    • フィールド数が異なるものがあるとエラーになる
  • フィールド数が不定の場合、 bufio.Scanner を使う

標準入出力

標準入力

メモ:

  • さくっと使うなら fmt.Scan 系が便利
  • 大量に読み込む必要があるときは bufio.Scanner を使う

関連項目:

参考:

TTYにつながっているか判定

CLIで、インタラクティブかどうかによって処理を変えたいことがある。
そんなときは github.com/mattn/go-isatty を使うといい。

Example:

if isatty.IsTerminal(os.Stdout.Fd()) {
	fmt.Println("Is Terminal")
} else {
	fmt.Println("Is Not Terminal")
}

他に使えるもの:

  • golang.org/x/crypto/ssh/terminal … 2020-07-19以前はこちらを使っていたが、上に乗り換えた。“golang.org/x/crypto” に含まれるので、これだけのために使うにはちょっと重い

参考:

関連項目:

ファイル入出力

ファイルを開いて書込み

func writeBytesToFile(b []byte, path string, flag int, perm os.FileMode) {
  file, err := os.OpenFile(path, flag, perm)
  if err != nil {
    log.Fatal(err)
  }
  defer file.Close()
  if _, err = file.Write(b); err != nil {
    log.Fatal(err)
  }
}

// ファイルがなければ新規作成。あれば既存の内容を消して上書き
writeBytesToFile(b, path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
// ファイルがなければ新規作成。あれば内容を追記する
writeBytesToFile(b, path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)

1つの入力から複数の出力先に出力

出力先が2つなら、io.TeeReaderで複製するのが手軽だと思う。

参考: