0Pricing
Go Academy · درس

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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Runes مقابل Bytes
  2. دوال الحزمة strings
  3. strings.Builder
  4. Unicode وutf8
← العودة إلى Go Academy