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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูนเทียบกับไบต์
- ฟังก์ชันในแพ็กเกจ strings
- strings.Builder
- Unicode และ utf8