🦁

Go言語 標準入力 【自分用まとめ】

2023/02/21に公開約2,100字

概要

Go言語で競技プログラミングを参加するときに、Go言語での標準入力を調べたので本記事で自分用にまとめました。

fmt.Scanを使用した標準入力

fmt.Scan(&標準入力で受けとった値を格納する変数)
スペース、改行までを一つの入力として受け取る

【標準入力で、1つの値を標準入力で受け取る】

main.go
package main

import "fmt"

func main() {
    var num int
    fmt.Scan(&num) 
    fmt.Println(num)
}
//ターミナル
$ go run main.go 
999

//出力
999

標準入力で、複数の値を標準入力で受け取る_パターン1

複数の値を、標準入力で受け取る場合
受け取る値の数が決まっているパターン

main.go
package main

import "fmt"

func main() {
	var num1, num2, num3 int
	fmt.Scan(&num1, &num2, &num3)
	fmt.Println(num1, num2, num3)
}

//ターミナル
$ go run main.go 
111 222 333 

//出力
111 222 333 

標準入力で、複数の値を標準入力で受け取る_パターン2

複数の値を、標準入力で受け取る場合
受け取る値の数が決まっていないパターン

main.go
package main

import "fmt"

func main() {
	//標準入力で受け取る値の個数を格納
	var len int
	fmt.Scan(&len)
    
	//標準入力を受け取り、格納
	slice := make([]int, len)
	for i := 0; i < len; i++ {
		fmt.Scan(&slice[i])
	}
	fmt.Println(slice)
}

//ターミナル
$ go run main.go 
3 111 222 333 

//出力
[111 222 333]

bufioパッケージを使用する

fmt.Scanは大量のデータを読み込むときに、スピードが遅くなります。bufioは読み込みスピードで、fmt.Scanより優れています。

一方で、入力された値を文字列として格納するので、数値型で処理したいときはキャストする必要があります。

bufio 使い方1_基本

bufioは1行分の標準入力を受け取る

main.go
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin) // スキャナを作成
	scanner.Scan()                        // 1行分の入力を取得
	str := scanner.Text()
	fmt.Print(str)
}

bufio 使い方1_スペース区切り

スペース区切りの文字を、受け取る

main.go
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	slice := strings.Split(scanner.Text(), " ")
	for _, str := range slice {
		fmt.Println(str)
	}
}

//ターミナル
go run main.go
111 222 333

//出力
111
222
333

bufio 使い方1_複数行

複数行を受け取る

main.go
package main

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

func main() {
    var n int 
    n = 3
    var str []string
    scanner := bufio.NewScanner(os.Stdin)
    for i := 0; i < n; i++ {
        scanner.Scan()
        str = append(str, scanner.Text())
    }
    fmt.Println(str)
}
$ go run main.go
111
222
333

//出力
[111 222 333]

Discussion

ログインするとコメントできます