genzai0の日記

にっき

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のリファレンスを見るのに時間がかかる。
慣れていきたい。