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

strings.Builder

สร้างสตริงอย่างมีประสิทธิภาพ

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

ต้นทุนของการต่อด้วย +

เนื่องจากสตริงเปลี่ยนแปลงไม่ได้ ทุกครั้งที่ใช้ s = s + part จะสร้างสตริงใหม่ทั้งหมดและคัดลอกไบต์ทั้งหมดอีกครั้ง

เมื่ออยู่ในลูป การทำเช่นนี้จะช้าและสิ้นเปลืองหน่วยความจำ

package main

import "fmt"

func main() {
    s := ""
    for i := 0; i < 3; i++ {
        s = s + "go "
    }
    fmt.Println(s)
}

ทำความรู้จัก strings.Builder

strings.Builder จะขยายบัฟเฟอร์ภายในและหลีกเลี่ยงการคัดลอกซ้ำ ๆ คุณเขียนข้อมูลลงไป แล้วอ่านผลลัพธ์เพียงครั้งเดียวเมื่อจบ

ประกาศตัวแปรได้ด้วย var b strings.Builder

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("Hello")
    fmt.Println(b.String())
}

WriteString ในลูป

ประโยชน์ที่แท้จริงจะแสดงชัดในลูป ให้เรียก WriteString ซ้ำ ๆ แล้วอ่านผลลัพธ์ครั้งเดียวด้วย String()

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    for i := 0; i < 3; i++ {
        b.WriteString("go ")
    }
    fmt.Println(b.String())
}

การเขียนไบต์และ rune

Builder รองรับมากกว่าสตริงเต็มรูปแบบ:

  • WriteByte เพิ่มไบต์เดียว
  • WriteRune เพิ่มจุดรหัส Unicode หนึ่งจุด
package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("Go")
    b.WriteByte('!')
    b.WriteRune('語')
    fmt.Println(b.String())
}

Builder ใช้อินเทอร์เฟซ io.Writer

เนื่องจาก Builder ตรงตามอินเทอร์เฟซ io.Writer คุณจึงใช้ร่วมกับ fmt.Fprintf เพื่อจัดรูปแบบลงในบัฟเฟอร์ได้โดยตรง

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    fmt.Fprintf(&b, "x=%d y=%d", 3, 4)
    fmt.Println(b.String())
}

การติดตามความยาว

b.Len() บอกจำนวนไบต์ที่เขียนไปแล้ว โดยไม่ต้องสร้างสตริงสุดท้าย

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("hello")
    fmt.Println(b.Len())
}

การจองล่วงหน้าด้วย Grow

หากทราบคร่าว ๆ ว่าผลลัพธ์จะมีขนาดเท่าใด ให้เรียก b.Grow(n) ก่อน วิธีนี้จะจองความจุไว้ล่วงหน้าและหลีกเลี่ยงการปรับขนาดบัฟเฟอร์ซ้ำ ๆ

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.Grow(64)
    for i := 0; i < 5; i++ {
        b.WriteString("item ")
    }
    fmt.Println(b.String())
}

การรีเซ็ต Builder

b.Reset() ทำให้บัฟเฟอร์ว่าง เพื่อให้คุณนำ Builder เดิมกลับมาใช้กับสตริงถัดไปได้

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("first")
    b.Reset()
    b.WriteString("second")
    fmt.Println(b.String())
}

ห้ามคัดลอก Builder

ห้ามคัดลอก strings.Builder หลังจากเริ่มใช้งานครั้งแรก ให้ส่งต่อโดยใช้พอยน์เตอร์ (*strings.Builder) แทน

package main

import (
    "fmt"
    "strings"
)

func add(b *strings.Builder, word string) {
    b.WriteString(word)
}

func main() {
    var b strings.Builder
    add(&b, "shared ")
    add(&b, "builder")
    fmt.Println(b.String())
}

การสร้างบรรทัด CSV

ตัวอย่างเชิงปฏิบัติ: ประกอบบรรทัดที่คั่นด้วยจุลภาคอย่างมีประสิทธิภาพด้วย Builder

package main

import (
    "fmt"
    "strings"
)

func main() {
    fields := []string{"id", "name", "age"}
    var b strings.Builder
    for i, f := range fields {
        if i > 0 {
            b.WriteByte(',')
        }
        b.WriteString(f)
    }
    fmt.Println(b.String())
}

ควรใช้ Builder เมื่อใด

เลือกใช้ strings.Builder เมื่อคุณต้องต่อหลายส่วนเข้าด้วยกัน โดยเฉพาะภายในลูป

สำหรับการเชื่อมสไลซ์ที่ทราบแน่ชัดเพียงครั้งเดียว strings.Join จะเรียบง่ายกว่าและเร็วไม่แพ้กัน

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    for i := 1; i <= 3; i++ {
        fmt.Fprintf(&b, "[%d]", i)
    }
    fmt.Println(b.String())
}

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

เหตุใดจึงควรใช้ Builder แทนการใช้ + ซ้ำ ๆ ในลูป

สรุป: strings.Builder

คุณได้เรียนรู้วิธีสร้างสตริงอย่างมีประสิทธิภาพแล้ว:

  • ประกาศด้วย var b strings.Builder
  • เพิ่มข้อมูลด้วย WriteString, WriteByte, WriteRune หรือ fmt.Fprintf
  • เลือกใช้ Grow ล่วงหน้า อ่านผลลัพธ์ครั้งเดียวด้วย String() และห้ามคัดลอก Builder
package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.Grow(16)
    b.WriteString("Go ")
    b.WriteString("builder!")
    fmt.Println(b.String())
}

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

บทเรียน “strings.Builder” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “strings.Builder”

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

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

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

บทเรียน “strings.Builder” ใช้เวลานานแค่ไหน

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

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

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

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

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