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

รูนเทียบกับไบต์

ทำความเข้าใจภายในสตริงของ Go

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

สตริง Go คืออะไร

ใน Go string คือลำดับไบต์ที่เปลี่ยนแปลงไม่ได้ ไบต์เหล่านี้มักเก็บข้อความที่เข้ารหัสแบบ UTF-8 แต่ Go ไม่ได้บังคับให้เป็นเช่นนั้น

  • คุณไม่สามารถเปลี่ยนสตริงโดยตรงได้
  • len ของสตริงนับเป็นไบต์ ไม่ใช่จำนวนอักขระ
package main

import "fmt"

func main() {
    s := "Go"
    fmt.Println(s)
    fmt.Println(len(s))
}

ไบต์เบื้องหลังการทำงาน

การเข้าถึงสตริงด้วยดัชนี s[i] จะคืนค่าไบต์เดียว (ชนิด byte ซึ่งเป็นชื่อแทนของ uint8)

สำหรับข้อความ ASCII ธรรมดา อักขระแต่ละตัวมีขนาดเท่ากับหนึ่งไบต์พอดี

package main

import "fmt"

func main() {
    s := "ABC"
    fmt.Println(s[0])
    fmt.Println(s[1])
    fmt.Println(s[2])
}

ไบต์คือตัวเลข

เนื่องจากไบต์เป็นเพียงตัวเลข การพิมพ์ s[0] จึงแสดง65 (รหัส ASCII ของ A) ไม่ใช่ตัวอักษร

หากต้องการเห็นอักขระ ให้แปลงไบต์กลับเป็นสตริง

package main

import "fmt"

func main() {
    s := "ABC"
    fmt.Println(string(s[0]))
}

rune คืออะไร

rune เป็นชื่อแทนของ int32 และแทนจุดรหัส Unicodeหนึ่งจุด

  • เมื่อเข้ารหัสเป็น UTF-8 rune หนึ่งตัวอาจกินพื้นที่หลายไบต์
  • ใช้ rune เมื่อคุณสนใจอักขระ ไม่ใช่ไบต์ดิบ
package main

import "fmt"

func main() {
    var r rune = 'A'
    fmt.Println(r)
    fmt.Println(string(r))
}

อักขระหลายไบต์

อักขระที่ไม่ใช่ ASCII ใช้พื้นที่มากกว่าหนึ่งไบต์ใน UTF-8 สตริงอย่าง "héllo" จึงมีจำนวนไบต์มากกว่าจำนวนตัวอักษร

สังเกตว่า len รายงานจำนวนไบต์ ซึ่งมากกว่าความยาวที่มองเห็นได้

package main

import "fmt"

func main() {
    s := "héllo"
    fmt.Println(len(s))
}

การวนดูสตริงด้วย range

ลูป for range ที่ทำงานกับสตริงจะถอดรหัส UTF-8 โดยอัตโนมัติ ในแต่ละรอบจะได้ค่า:

  • ดัชนีไบต์ที่เป็นจุดเริ่มต้นของ rune
  • rune นั้นเอง
package main

import "fmt"

func main() {
    for i, r := range "héllo" {
        fmt.Println(i, string(r))
    }
}

การนับอักขระอย่างถูกต้อง

หากต้องการนับอักขระแทนไบต์ ให้แปลงสตริงเป็น []rune แล้วหาความยาว

วิธีนี้จะให้จำนวนจุดรหัส

package main

import "fmt"

func main() {
    s := "héllo"
    runes := []rune(s)
    fmt.Println(len(runes))
}

การเข้าถึงด้วยดัชนี rune

เมื่อมี []rune แล้ว คุณสามารถใช้ดัชนีเพื่อรับอักขระลำดับที่ N ได้อย่างถูกต้อง แม้เป็นข้อความหลายไบต์

package main

import "fmt"

func main() {
    runes := []rune("héllo")
    fmt.Println(string(runes[1]))
}

แปลงสตริงเป็นไบต์และแปลงกลับ

คุณสามารถแปลงระหว่างสตริงกับ []byte ได้อย่างอิสระ

  • []byte(s) ให้ไบต์ดิบ
  • string(b) สร้างข้อความกลับคืนมา
package main

import "fmt"

func main() {
    b := []byte("Go")
    fmt.Println(b)
    fmt.Println(string(b))
}

สร้างสตริงจาก rune

สไลซ์ของ rune สามารถแปลงกลับเป็นสตริงได้ด้วยวิธีเดียวกัน ซึ่งมีประโยชน์หลังจากแก้ไขอักขระทีละตัว

package main

import "fmt"

func main() {
    runes := []rune{'G', 'o', '!'}
    fmt.Println(string(runes))
}

สรุปไบต์เทียบกับ rune

แบบจำลองทางความคิดอย่างรวดเร็ว:

  • byte = ไบต์ดิบหนึ่งไบต์ (uint8) และ len(s) จะนับไบต์เหล่านี้
  • rune = จุดรหัส Unicode หนึ่งจุด (int32) และ range จะคืนค่าเหล่านี้
  • ใช้ []rune เมื่อต้องนับหรือเข้าถึงอักขระด้วยดัชนี
package main

import "fmt"

func main() {
    s := "café"
    fmt.Println(len(s))
    fmt.Println(len([]rune(s)))
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับ rune และไบต์

สรุป: rune เทียบกับไบต์

คุณได้เรียนรู้ว่าสตริง Go เป็นลำดับไบต์ที่เปลี่ยนแปลงไม่ได้ ซึ่งโดยทั่วไปใช้ UTF-8

  • byte คือไบต์ดิบ และ len นับไบต์
  • rune คือจุดรหัส Unicode และ range จะถอดรหัสจุดรหัสเหล่านี้
  • แปลงด้วย []byte(s) และ []rune(s) เพื่อทำงานในระดับที่เหมาะสม
package main

import "fmt"

func main() {
    s := "Go語"
    fmt.Println("bytes:", len(s))
    fmt.Println("runes:", len([]rune(s)))
}

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

บทเรียน “รูนเทียบกับไบต์” ฟรีหรือไม่

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

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

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

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

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

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

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

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

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

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

  1. รูนเทียบกับไบต์
  2. ฟังก์ชันในแพ็กเกจ strings
  3. strings.Builder
  4. Unicode และ utf8
← กลับไปที่ Go Academy