Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Go辞典
  3. fmt.Scan() / Scanf() / Scanln()

fmt.Scan() / Scanf() / Scanln()

『fmt.Scan()』『fmt.Scanf()』『fmt.Scanln()』はGoで標準入力(stdin)から値を読み取る関数です。ユーザーからの入力を受け取るCLIプログラムで使います。

構文
import "fmt"

// スペースまたは改行区切りで値を読み取ります。
n, err := fmt.Scan(&変数1, &変数2)

// フォーマット文字列に従って読み取ります。
n, err := fmt.Scanf("書式文字列", &変数1, &変数2)

// 1行から値を読み取ります(改行を区切りとして扱います)。
n, err := fmt.Scanln(&変数1, &変数2)

// 戻り値:
// n   — 正常に読み取った項目数
// err — エラー(io.EOFなど)
関数一覧
関数概要
fmt.Scan(a ...any)標準入力からスペース・改行区切りで値を読み取ります。
fmt.Scanf(format, a ...any)フォーマット文字列に従って標準入力から値を読み取ります。
fmt.Scanln(a ...any)1行を読み取ります。改行で読み取りを終了します。
fmt.Fscan(r, a ...any)io.Readerから値を読み取ります。
fmt.Sscan(str, a ...any)文字列から値を読み取ります(文字列を入力ソースとします)。
サンプルコード
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    // fmt.Sscanを使って文字列から値を読み取ります(実行例として使います)。
    // 実際のプログラムでは fmt.Scan を使います。

    // Scan:スペース区切りで複数の値を読み取ります。
    var name string
    var age int
    input := "山田 30"
    fmt.Sscan(input, &name, &age) // 文字列から読み取り(テスト用)
    fmt.Printf("名前: %s, 年齢: %d\n", name, age)

    // Scanf:フォーマットを指定して読み取ります。
    var x, y float64
    fmt.Sscanf("3.14 2.72", "%f %f", &x, &y)
    fmt.Printf("x=%.2f, y=%.2f\n", x, y)

    // Scanln:1行を読み取ります。
    var word1, word2 string
    fmt.Sscanln("Hello World", &word1, &word2)
    fmt.Printf("word1=%s, word2=%s\n", word1, word2)

    fmt.Println()

    // 実際のCLI入力には bufio.Scanner が推奨されます(スペースを含む行全体を読み取れます)。
    scanner := bufio.NewScanner(strings.NewReader("Go言語の辞典\n"))
    if scanner.Scan() {
        fmt.Println("1行読み取り:", scanner.Text())
    }

    // 標準入力から読み取る場合(コメントを外して使います):
    // scanner := bufio.NewScanner(os.Stdin)
    // fmt.Print("入力: ")
    // if scanner.Scan() {
    //     line := scanner.Text()
    //     fmt.Println("受け取りました:", line)
    // }

    _ = os.Stdin // 使用宣言(コンパイルエラー回避)
}
概要

『fmt.Scan()』系の関数は単純な値の読み取りに向いていますが、スペースを含む文字列(フルネームなど)の読み取りが苦手です。1行全体を読み取りたい場合は『bufio.NewScanner(os.Stdin)』を使うのが一般的です。競技プログラミングでは高速入力のために『bufio.NewReader(os.Stdin)』と『fmt.Fscan()』を組み合わせるパターンもよく使われます。

fmt.Scanf()のフォーマット文字列で改行('\n')の扱いに注意が必要です。Windowsの改行コード(\r\n)を含む入力では予期しない動作をすることがあります。本番のCLIツールではbufio.Scannerの使用を推奨します。

fmt.Println()など出力関数については『fmt.Println() / Printf()』、バッファリングI/Oは『io.Reader / Writer / bufio』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。