はじめに
このチュートリアルでは、Golang で標準入力を 1 行ずつ読み取るための重要な技術を探ります。入力処理を習得したい開発者を対象として、このガイドでは、Golang の強力な入力読み取り機能を使って、ユーザー入力、ファイルストリーム、コマンドラインインタラクションを効率的に処理するための包括的な戦略を提供します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
このチュートリアルでは、Golang で標準入力を 1 行ずつ読み取るための重要な技術を探ります。入力処理を習得したい開発者を対象として、このガイドでは、Golang の強力な入力読み取り機能を使って、ユーザー入力、ファイルストリーム、コマンドラインインタラクションを効率的に処理するための包括的な戦略を提供します。
標準入力 (stdin) は、Unix 系オペレーティングシステムおよびプログラミングにおける基本的な概念です。これは、プログラムがコマンドラインから、または入力リダイレクトを通じてデータを読み取ることができるデフォルトの入力ストリームを表します。
Golang では、標準入力は os.Stdin
で表されます。これは、コンソールからの入力やパイプされたデータを読み取ることができるファイルディスクリプタです。bufio
パッケージは、入力ストリームを効率的に処理するための便利なメソッドを提供します。
Golang で入力を読み取る方法はいくつかあります。
メソッド | パッケージ | 説明 |
---|---|---|
fmt.Scan() |
fmt | シンプルな入力読み取り |
bufio.Scanner |
bufio | 1 行ずつの読み取り |
bufio.Reader |
bufio | 柔軟な入力読み取り |
package main
import (
"fmt"
"os"
)
func main() {
var input string
fmt.Print("Enter something: ")
fmt.Scanln(&input)
fmt.Printf("You entered: %s\n", input)
}
os.Stdin
を通じてアクセス可能なグローバルなストリームです。bufio.Scanner
の使用を推奨しています。大量の入力を扱う場合は、バッファ付きリーダーを使用してメモリと処理パフォーマンスを最適化します。bufio
パッケージは効率的な入力処理メカニズムを提供します。
1 行ずつの読み取りは、入力ストリームを順次処理するための重要な技術であり、開発者が Golang でテキストデータを効率的に処理することを可能にします。
bufio.Scanner
は、入力を 1 行ずつ読み取るために最も推奨される方法です。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("Enter lines of text (Ctrl+D to finish):")
for scanner.Scan() {
line := scanner.Text()
fmt.Println("Read line:", line)
}
if err := scanner.Err(); err!= nil {
fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
}
メソッド | 説明 | 使用例 |
---|---|---|
scanner.Scan() |
次の行を読み取ります | 最も一般的な行の読み取り |
scanner.Text() |
現在の行を返します | 行の内容を取得する |
scanner.Bytes() |
行をバイトスライスとして返します | 低レベルの処理 |
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords) // Read word by word
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 0), 1024*1024) // Increase buffer size
常にスキャンエラーを確認してください。
scanner.Err()
は、遭遇したエラーを返します。大量の入力ストリームを扱う場合は、バッファ付きのスキャンを使用してメモリ使用量とパフォーマンスを最適化することを検討してください。
実用的な入力処理には、さまざまな種類の入力ストリームの管理、複雑なデータの処理、および堅牢なエラー処理戦略の実装が含まれます。
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func processCSVInput() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("Enter CSV-like data (Name,Age,City):")
for scanner.Scan() {
fields := strings.Split(scanner.Text(), ",")
if len(fields) == 3 {
name, age, city := fields[0], fields[1], fields[2]
fmt.Printf("Processed: Name=%s, Age=%s, City=%s\n", name, age, city)
}
}
}
戦略 | 説明 | 使用例 |
---|---|---|
検証 (Validation) | 入力形式をチェックする | データの整合性 |
変換 (Transformation) | 入力の型を変換する | データ処理 |
エラー回復 (Error Recovery) | 無効な入力を処理する | 堅牢なアプリケーション |
package main
import (
"bufio"
"fmt"
"os"
"time"
)
func inputWithTimeout() {
inputChan := make(chan string)
go func() {
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
inputChan <- scanner.Text()
}
}()
select {
case input := <-inputChan:
fmt.Println("Received input:", input)
case <-time.After(5 * time.Second):
fmt.Println("Input timeout")
}
}
func validateInput(input string) bool {
// Custom validation logic
return len(input) > 0 && len(input) <= 100
}
func processInput() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
input := scanner.Text()
if validateInput(input) {
// Process valid input
fmt.Println("Valid input:", input)
} else {
fmt.Println("Invalid input")
}
}
}
Golang で標準入力 (stdin) を 1 行ずつ読み取る技術を習得することで、開発者はより堅牢で柔軟な入力処理アプリケーションを作成することができます。このチュートリアルで取り上げた技術は、さまざまな入力シナリオを処理するための強固な基盤を提供し、コマンドラインツール、データ処理、および対話型の Golang アプリケーションにおいて、より効率的で読みやすいコードを実現します。