ตัวสแกน
อ่านทีละบรรทัด
ตัวสแกน เป็นบทเรียน 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: เรียบง่าย ใช้กับโทเคนทีละบรรทัดหรือทีละคำ ตัดอักขระขึ้นบรรทัดใหม่โดยอัตโนมัติ และมีขีดจำกัดเริ่มต้น 64KBReader: ควบคุมได้เต็มที่ ไม่มีขีดจำกัดขนาด และต้องจัดการตัวคั่นด้วยตนเอง
เริ่มต้นด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ