バッファ付きWriter
書き込みをまとめて行います
「バッファ付きWriter」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
バッファ付き書き込みの理由
読み取りと同様に、小さな書き込みを行うたびにシステムコールが発生する可能性があります。bufio.Writerは書き込みをメモリ上に集め、大きな単位でフラッシュします。
重要:Flush()を呼び出さないと、バッファに蓄積されたデータは失われます。
bufio.Writerの作成
任意のio.Writerをラップします。ここではos.Stdoutをラップしています。
package main
import (
"bufio"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
w.WriteString("Hello buffered\n")
w.Flush()
}Flushを忘れない
Flush()を呼び出さないと、出力が表示されない可能性があります。よく使われる書き方はdefer w.Flush()です。
package main
import (
"bufio"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
w.WriteString("written via defer\n")
}バイトと文字列の書き込み
バイトスライスにはWrite、文字列にはWriteString、単一の値にはWriteByteとWriteRuneを使用します。
package main
import (
"bufio"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
w.Write([]byte("bytes "))
w.WriteString("string ")
w.WriteRune('!')
w.WriteByte('\n')
w.Flush()
}バッファの状態を確認する
Buffered()は待機中のバイト数を、Available()は残っている空き容量を返します。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
w.WriteString("abc")
fmt.Fprintf(os.Stderr, "buffered: %d\n", w.Buffered())
w.Flush()
}満杯時の自動フラッシュ
バッファが満杯になると、bufio.Writerは自動的にフラッシュします。ただし、残りの一部だけ埋まったバッファを処理するため、最後にはFlush()を呼び出す必要があります。
カスタムバッファサイズ
bufio.NewWriterSize(w, size)は容量を設定します。バッファを大きくするとフラッシュの頻度を下げられます。
package main
import (
"bufio"
"os"
)
func main() {
w := bufio.NewWriterSize(os.Stdout, 8192)
w.WriteString("custom size buffer\n")
w.Flush()
}Fprintfによる書式付き書き込み
bufio.Writerはio.Writerなので、fmt.Fprintfに渡して、書式付きのバッファ出力を行えます。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
for i := 1; i <= 3; i++ {
fmt.Fprintf(w, "line %d\n", i)
}
w.Flush()
}Writeエラーの処理
エラーは後続の書き込み時、またはFlush()の呼び出し時に発生することがあります。Flush()が返すエラーは必ず確認してください。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
w.WriteString("data\n")
if err := w.Flush(); err != nil {
fmt.Fprintln(os.Stderr, "flush failed:", err)
}
}多数の書き込みをまとめる
本当の効果はここにあります。小さな書き込みを行うタイトなループが、バッファリング後には1回(または数回)のシステムコールになります。
package main
import (
"bufio"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
for i := 0; i < 5; i++ {
w.WriteString("x")
}
w.WriteByte('\n')
}ベストプラクティス
- 必ず
Flush()を呼び出す(またはdeferで呼び出す) - 各書き込みのエラーだけでなく、
Flush()のエラーも確認する - ワークロードに合わせてバッファサイズを決める
理解度チェック
バッファ付きWriterについての知識を確認しましょう。
まとめ
bufio.Writerを使って書き込みをまとめる方法を学びました。
NewWriter/NewWriterSizeWrite、WriteString、WriteByte、WriteRunefmt.Fprintfと組み合わせて使える- 必ず
Flush()を呼び出し、そのエラーを確認する
よくある質問
「バッファ付きWriter」レッスンは無料ですか?
はい。「バッファ付きWriter」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「バッファ付きWriter」で何を学びますか?
書き込みをまとめて行います ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「バッファ付きWriter」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- バッファ付きReader
- Scanner
- バッファ付きWriter
- 大容量ファイルのストリーミング