いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-256 (fmt.Scan, fmt.Scanfのメモ)

概要

以下自分用のメモです。たまにしか使わないんですが、その度に使い方微妙に忘れるのでここにメモメモ。。。

一つの値を読み取り

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

参考情報

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。