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フィードバックを取得できます。ローカル設定は不要です。