概要
以下自分用のメモです。たまにしか使わないんですが、その度に使い方微妙に忘れるのでここにメモメモ。。。
一つの値を読み取り
package scanop import ( "fmt" "github.com/devlights/gomy/output" ) // ReadOneInput は、fmt.Scan() で一つの値を読み取るサンプルです. // // # REFERENCES // // - https://dev.to/azure/go-from-the-beginning-reading-user-input-i79 // - https://pkg.go.dev/fmt@go1.19.2#Scan func ReadOneInput() error { var ( value string ) fmt.Print("INPUT: ") // スペースで区切られて読み取られるため、例えば"hello world"と指定するとhelloだけが読み取られる. n, err := fmt.Scan(&value) if err != nil { return err } output.Stdoutf("[fmt.Scan]", "count=%d\tvalue=%v\n", n, value) return nil }
実行すると以下のようになります。
$ task run task: [run] go run . -onetime ENTER EXAMPLE NAME: scanop_read_one_input [Name] "scanop_read_one_input" INPUT: hello [fmt.Scan] count=1 value=hello [Elapsed] 2.820809171s
複数の値を読み取り
package scanop import ( "fmt" "github.com/devlights/gomy/output" ) // ReadMultipleInput は、fmt.Scan() で複数の値を読み取るサンプルです. // // # REFERENCES // // - https://dev.to/azure/go-from-the-beginning-reading-user-input-i79 // - https://pkg.go.dev/fmt@go1.19.2#Scan func ReadMultipleInput() error { var ( value1, value2 string ) fmt.Print("INPUT: ") // 改行は一つの空白(つまり区切り文字)として認識される // つまり "hello world" と // "hello // // world" // は同じ挙動となる. n, err := fmt.Scan(&value1, &value2) if err != nil { return err } output.Stdoutf("[fmt.Scan]", "count=%d\tvalue1=%v\tvalue2=%v\n", n, value1, value2) return nil }
実行すると以下のようになります。
$ task run task: [run] go run . -onetime ENTER EXAMPLE NAME: scanop_read_multi_input [Name] "scanop_read_multi_input" INPUT: hello world [fmt.Scan] count=2 value1=hello value2=world [Elapsed] 2.896289507s
書式に従って値を読み取り
package scanop import ( "fmt" "github.com/devlights/gomy/output" ) // ReadFormattedInput は、fmt.Scanf() で書式化された入力値を読み取るサンプルです. // // # REFERENCES // // - https://dev.to/azure/go-from-the-beginning-reading-user-input-i79 // - https://pkg.go.dev/fmt@go1.19.2#Scanf func ReadFormattedInput() error { var ( value1 int value2 string format = "%3d %5s\n" ) fmt.Print("INPUT(\\d{1,3} [^ ]{1,5}): ") // フォーマットに従った形で読み取りが行われる。 // 改行もパターンの一つとして認識される。 // フォーマットに合致しない場合 error となる。 n, err := fmt.Scanf(format, &value1, &value2) if err != nil { return err } output.Stdoutf("[fmt.Scanf]", "count=%d\tvalue1=%d\tvalue2=%s\n", n, value1, value2) return nil }
実行すると以下のようになります。
$ task run task: [run] go run . -onetime ENTER EXAMPLE NAME: scanop_read_formatted_input [Name] "scanop_read_formatted_input" INPUT(\d{1,3} [^ ]{1,5}): 789 hello [fmt.Scanf] count=2 value1=789 value2=hello [Elapsed] 21.091929504s
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。