入出力
標準入出力とファイル入出力関連。
関連項目
特に、ファイル入出力に関するもの:
参考:
- 逆引きGolang (ファイル)
- Goでテキストファイルを読み書きする時に使う標準パッケージ - Qiita
- How to read/write from/to file using Go? - Stack Overflow
テキストの読取り
空白区切りのテキストを読み取る
半角スペースやタブ区切りの文字列を読み取るとき。
- フィールド数が固定なら
fmt.Scan
系の関数が使える- フィールド数が異なるものがあるとエラーになる
- フィールド数が不定の場合、
bufio.Scanner
を使う- 分割したいときは strings.Fields でスライスにできる
標準入出力
標準入力
メモ:
- さくっと使うなら
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で複製するのが手軽だと思う。
参考:
- go - Golang io.copy twice on the request body - Stack Overflow
- Forwarding reader to multiple consumers - Michal Pristas - Medium
最終更新 2020-07-20: [prog/go] Use mattn/go-isatty to detect TTY (8fcd97382)