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

ตัวสแกน

อ่านทีละบรรทัด

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

bufio.Scanner คืออะไร

bufio.Scanner เป็นวิธีที่ง่ายที่สุดในการอ่านอินพุต ทีละโทเคน โดยทั่วไปคืออ่านทีละบรรทัด

เครื่องมือนี้ซ่อนรายละเอียดการใช้บัฟเฟอร์และการจัดการตัวคั่นไว้ให้ พร้อมตัดอักขระขึ้นบรรทัดใหม่ที่อยู่ท้ายบรรทัดออกให้โดยอัตโนมัติ

การอ่านทีละบรรทัด

สร้างตัวสแกน แล้ววนลูปด้วย Scan() ซึ่งจะส่งคืนค่า false เมื่อถึงจุดสิ้นสุด อ่านโทเคนปัจจุบันด้วย Text()

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("one\ntwo\nthree"))
	for s.Scan() {
		fmt.Println("line:", s.Text())
	}
}

การอ่านทีละคำ

กำหนดฟังก์ชันแบ่งส่วนด้วย Split(bufio.ScanWords) เพื่อแยกโทเคนตามช่องว่างแทนการแยกตามบรรทัด

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("the quick brown fox"))
	s.Split(bufio.ScanWords)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

การนับโทเคน

Scanner ช่วยให้การนับเป็นเรื่องง่าย ในที่นี้เรานับคำ

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("a b c d e"))
	s.Split(bufio.ScanWords)
	count := 0
	for s.Scan() {
		count++
	}
	fmt.Println("words:", count)
}

Bytes เทียบกับ Text

Text() จะส่งคืนสำเนาของสตริง ส่วน Bytes() จะส่งคืนสไลซ์เบื้องหลัง ซึ่งจะถูกนำกลับมาใช้ใหม่เมื่อเรียก Scan() ครั้งถัดไป โปรดคัดลอกข้อมูลหากต้องการเก็บไว้

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("data"))
	s.Scan()
	fmt.Println(len(s.Bytes()), "bytes")
}

การอ่านทีละรูน

bufio.ScanRunes จะแบ่งอินพุตออกเป็นรูน UTF-8 โดยมีหนึ่งโทเคนต่อหนึ่งอักขระ

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("Gö"))
	s.Split(bufio.ScanRunes)
	for s.Scan() {
		fmt.Printf("[%s]", s.Text())
	}
	fmt.Println()
}

การตรวจสอบข้อผิดพลาด

การที่ Scan() ส่งคืนค่า false อาจหมายถึง EOF หรือเกิดข้อผิดพลาด หลังจบลูป ให้เรียก s.Err() เพื่อแยกแยะสองกรณีนี้

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("ok\nfine"))
	for s.Scan() {
		fmt.Println(s.Text())
	}
	if err := s.Err(); err != nil {
		fmt.Println("error:", err)
	}
}

ขีดจำกัดขนาดโทเคน

โดยค่าเริ่มต้น โทเคนหนึ่งรายการต้องมีขนาดไม่เกิน bufio.MaxScanTokenSize (64KB) หากบรรทัดยาวกว่านั้น Scan() จะหยุดพร้อมข้อผิดพลาด

การเพิ่มขนาดบัฟเฟอร์

ใช้ Buffer(buf, max) เพื่อให้รองรับโทเคนที่ใหญ่ขึ้น โดยส่งบัฟเฟอร์เริ่มต้นและขนาดสูงสุด

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("long line here"))
	buf := make([]byte, 0, 1024)
	s.Buffer(buf, 1024*1024)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

ฟังก์ชันแบ่งส่วนแบบกำหนดเอง

ฟังก์ชันแบ่งส่วนมีลายเซ็นเป็น func(data []byte, atEOF bool) (advance int, token []byte, err error) คุณสามารถแบ่งตามจุลภาค ความกว้างคงที่ หรือเงื่อนไขใด ๆ ก็ได้

Scanner เทียบกับ Reader

  • Scanner: เรียบง่าย ใช้กับโทเคนทีละบรรทัดหรือทีละคำ ตัดอักขระขึ้นบรรทัดใหม่โดยอัตโนมัติ และมีขีดจำกัดเริ่มต้น 64KB
  • Reader: ควบคุมได้เต็มที่ ไม่มีขีดจำกัดขนาด และต้องจัดการตัวคั่นด้วยตนเอง

เริ่มต้นด้วย Scanner ก่อน แล้วเปลี่ยนไปใช้ Reader เมื่อต้องการความสามารถมากขึ้น

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

ทดสอบความรู้เกี่ยวกับ Scanner

สรุปทบทวน

คุณได้เรียนรู้การอ่านอินพุตทีละโทเคนด้วย bufio.Scanner

  • วนลูปด้วย Scan() + Text()/Bytes()
  • ใช้ Split ร่วมกับ ScanLines/ScanWords/ScanRunes
  • ตรวจสอบ Err() หลังจบลูป
  • ใช้ Buffer กับโทเคนที่มีขนาดเกิน 64KB

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

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

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

คุณจะเรียนรู้อะไรในบทเรียน “ตัวสแกน”

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

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

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

บทเรียน “ตัวสแกน” ใช้เวลานานแค่ไหน

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

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

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

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

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