goの標準入力のメモ
概要
goをやり始めの人が標準入力で変数を取るのに効率的と考えられる方法をまとめた。
標準入力の受け取り
時短で書けるようにシンプルさを主軸において記す。
したがって、自分で実装する量を極力少なくする方向で努力する。
一単語~受け取り
import "fmt" func main(){ var i int var c byte var s string fmt.Scan(&i) fmt.Scanf("%c %s", &c, &s) fmt.Printf("%d %c %s", i,c,s) }
想定
1 h stringissogood
速度的に微妙という記事も見かけたが簡単なのでfmt.Scan(addr)で一単語取ってしまおう。
5個くらいの書くのが億劫でない数に収まれば、scanfですべて取ってしまうのも手。
空白区切りの単語
フォーマット指定と変数を10個もだらだら書くわけにはいかないので、bufioを使いsplitで分割してから逐次scanで読み込む。
import ( "fmt" "os" "bufio" "strconv" //intへのキャスト、Atoi関数用 ) func main(){ sc := bufio.NewScanner(os.Stdin) sc.Split(bufio.ScanWords) //ここでsplitして各要素を空白区切りで認識可能にする for ;sc.Scan();{ // sc.Scanの戻り値はboolでforの条件に入れることによって終端時に抜けるようにする。 // sc.Scan時にセットされたテキストをsc.Textで得る。sc.Textをキャストし、vに代入。 v,_ := strconv.Atoi(sc.Text()) fmt.Println(v) } }
想定
1 65 234 666
おそらく、手入力すると無限ループが発生するが$ go run main.go < textのようにあらかじめ記述しておいたファイルをリダイレクトすると処理は通常終了する。
感想
改めて見ると簡単だが、未だにAPIのリファレンスを見るのに時間がかかる。
慣れていきたい。