ตัวเขียนแบบมีบัฟเฟอร์
เขียนข้อมูลเป็นชุด
ตัวเขียนแบบมีบัฟเฟอร์ เป็นบทเรียน 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/NewWriterSizeWrite,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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวอ่านแบบมีบัฟเฟอร์
- ตัวสแกน
- ตัวเขียนแบบมีบัฟเฟอร์
- การสตรีมไฟล์ขนาดใหญ่