0Pricing
Go Academy · レッスン

バッファ付き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 / NewWriterSize
  • Write、WriteString、WriteByte、WriteRune
  • fmt.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フィードバックを取得できます。ローカル設定は不要です。

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

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