strings.Builder
أنشئ السلاسل النصية بكفاءة
strings.Builder درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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())
}كتابة البايتات وrunes
يقبل 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()، ولا تنسخه مطلقًا.
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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «strings.Builder»؟
أنشئ السلاسل النصية بكفاءة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «strings.Builder»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Runes مقابل Bytes
- دوال الحزمة strings
- strings.Builder
- Unicode وutf8