0Pricing
Go Academy · บทเรียน

ตัวเขียนแบบมีบัฟเฟอร์

เขียนข้อมูลเป็นชุด

ตัวเขียนแบบมีบัฟเฟอร์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้ Buffer เขียนข้อมูล

เช่นเดียวกับการอ่าน การเขียนข้อมูลทีละน้อยแต่ละครั้งอาจเรียกใช้ระบบ 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()
}

การจัดการข้อผิดพลาดในการเขียน

ข้อผิดพลาดอาจปรากฏในการเขียนครั้งถัดไปหรือเมื่อเรียกใช้ 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)
	}
}

การรวมการเขียนหลายครั้ง

ประโยชน์สำคัญคือ ลูปที่เขียนข้อมูลทีละน้อยอย่างต่อเนื่องจะกลายเป็นการเรียกใช้ระบบเพียงครั้งเดียวหรือไม่กี่ครั้งหลังจากใช้บัฟเฟอร์

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() ไม่ใช่ตรวจสอบเฉพาะจากการเขียนแต่ละครั้ง
  • กำหนดขนาดบัฟเฟอร์ให้เหมาะกับลักษณะงาน

ตรวจสอบความเข้าใจ

ทดสอบความรู้เกี่ยวกับตัวเขียนที่ใช้บัฟเฟอร์

สรุปทบทวน

คุณได้เรียนรู้การรวมการเขียนหลายครั้งด้วย bufio.Writer

  • NewWriter / NewWriterSize
  • Write, WriteString, WriteByte, WriteRune
  • ใช้ร่วมกับ fmt.Fprintf ได้
  • เรียกใช้ Flush() และตรวจสอบข้อผิดพลาดที่ส่งคืนเสมอ

คำถามที่พบบ่อย

บทเรียน “ตัวเขียนแบบมีบัฟเฟอร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวเขียนแบบมีบัฟเฟอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวเขียนแบบมีบัฟเฟอร์”

เขียนข้อมูลเป็นชุด คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวเขียนแบบมีบัฟเฟอร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวอ่านแบบมีบัฟเฟอร์
  2. ตัวสแกน
  3. ตัวเขียนแบบมีบัฟเฟอร์
  4. การสตรีมไฟล์ขนาดใหญ่
← กลับไปที่ Go Academy