0Pricing
Go Academy · レッスン

Scanner

1行ずつ読み取ります

「Scanner」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

bufio.Scannerとは

bufio.Scannerは、入力をトークン単位で読み取る最も簡単な方法です。通常は1行ずつ読み取るために使用します。

バッファリングと区切り文字の処理を隠蔽し、末尾の改行も自動的に削除します。

行のスキャン

スキャナーを作成し、Scan()を使ったループを実行します。Scan()は末尾に達するとfalseを返します。現在のトークンはText()で読み取ります。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("one\ntwo\nthree"))
	for s.Scan() {
		fmt.Println("line:", s.Text())
	}
}

単語のスキャン

Split(bufio.ScanWords)で分割関数を設定すると、行単位ではなく空白でトークン化できます。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("the quick brown fox"))
	s.Split(bufio.ScanWords)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

トークン数のカウント

Scannerを使うとカウントは簡単です。ここでは単語数を数えています。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("a b c d e"))
	s.Split(bufio.ScanWords)
	count := 0
	for s.Scan() {
		count++
	}
	fmt.Println("words:", count)
}

バイトとテキスト

Text()は文字列のコピーを返します。Bytes()は基になるスライスを返しますが、そのスライスは次のScan()で再利用されます。保持する必要がある場合はコピーしてください。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("data"))
	s.Scan()
	fmt.Println(len(s.Bytes()), "bytes")
}

runeのスキャン

bufio.ScanRunesは入力をUTF-8のruneに分割し、1文字につき1つのトークンにします。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("Gö"))
	s.Split(bufio.ScanRunes)
	for s.Scan() {
		fmt.Printf("[%s]", s.Text())
	}
	fmt.Println()
}

エラーの確認

Scan()がfalseを返した場合、EOFまたはエラーの可能性があります。ループの後にs.Err()を呼び出して区別してください。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("ok\nfine"))
	for s.Scan() {
		fmt.Println(s.Text())
	}
	if err := s.Err(); err != nil {
		fmt.Println("error:", err)
	}
}

トークンサイズの上限

デフォルトでは、1つのトークンはbufio.MaxScanTokenSize(64KB)を超えられません。これより長い行があると、Scan()はエラーで停止します。

バッファを拡張する

Buffer(buf, max)を使うと、より大きなトークンを扱えるようになります。初期バッファと最大サイズを渡してください。

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("long line here"))
	buf := make([]byte, 0, 1024)
	s.Buffer(buf, 1024*1024)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

カスタム分割関数

分割関数のシグネチャはfunc(data []byte, atEOF bool) (advance int, token []byte, err error)です。カンマや固定幅など、任意の方法で分割できます。

ScannerとReaderの比較

  • Scanner:単純で、行や単語をトークンとして扱い、改行を自動的に削除します。デフォルトの上限は64KBです
  • Reader:完全な制御が可能で、サイズ制限がなく、区切り文字を手動で処理します

まずはScannerを使い、より細かな制御が必要になったらReaderに切り替えてください。

理解度チェック

Scannerについての知識を確認しましょう。

まとめ

bufio.Scannerを使って、入力をトークン単位で読み取る方法を学びました。

  • Scan() + Text()/Bytes()のループ
  • SplitとScanLines/ScanWords/ScanRunesの組み合わせ
  • ループの後にErr()を確認する
  • 64KBを超えるトークンにはBufferを使用する

よくある質問

「Scanner」レッスンは無料ですか?

はい。「Scanner」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「Scanner」で何を学びますか?

1行ずつ読み取ります ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Scanner」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. バッファ付きReader
  2. Scanner
  3. バッファ付きWriter
  4. 大容量ファイルのストリーミング
← Go Academyに戻る