0Pricing
Go Academy · درس

‏sync.Once وsync.Map

التهيئة لمرة واحدة والخرائط المتزامنة

‏sync.Once وsync.Map درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

sync.Once

يضمن sync.Once تشغيل دالة مرة واحدة بالضبط، مهما بلغ عدد goroutines التي تستدعيها بالتزامن. ومن حالات الاستخدام الشائعة تهيئة singleton عند الطلب.

Once.Do

ينفّذ الاستدعاء الأول فقط إلى Do الدالة؛ أما الاستدعاءات اللاحقة فلا تفعل شيئًا، حتى إذا استُدعيت من goroutines مختلفة.

var once sync.Once
var db *Database

func getDB() *Database {
    once.Do(func() { db = openDB() })
    return db
}

لا تتم إعادة ضبط Once

بعد تشغيل sync.Once، لا يمكن إعادة ضبطه. إذا احتجت إلى تنفيذ لمرة واحدة قابل لإعادة الضبط، فأدر الحالة يدويًا باستخدام atomic أو Mutex.

سلوك Once عند حدوث panic

إذا حدث panic في الدالة المُمرَّرة إلى Do، يُعد Do مكتملًا، وتصبح الاستدعاءات المستقبلية بلا تأثير. ينتقل panic إلى المستدعي الأول.

نظرة عامة على sync.Map

‏sync.Map هو map متزامن لا يحتاج إلى أقفال خارجية. وقد حُسّن لنمطين: (1) الكتابة مرة واحدة والقراءة مرات عديدة؛ (2) مجموعات مفاتيح منفصلة لكل goroutine.

طرائق sync.Map

الطرائق الأساسية: Store وLoad وLoadOrStore وDelete وRange. لا توجد معاملات أنواع عامة — المفاتيح والقيم من النوع interface{}.

var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }

LoadOrStore

يعيد LoadOrStore القيمة الموجودة إذا كان المفتاح موجودًا، وإلا فإنه يخزّن القيمة الجديدة ويعيدها. وتشير القيمة المنطقية إلى ما إذا كانت القيمة قد حُمّلت (true) أو خُزّنت (false).

actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }

Range

تكرّر Range على جميع أزواج المفتاح والقيمة، وتستدعي الدالة لكل زوج. أعد false لإيقاف التكرار.

m.Range(func(k, v any) bool {
    fmt.Println(k, v)
    return true // continue
})

متى تستخدم sync.Map

فضّل map عاديًا مع Mutex في معظم الحالات — فهو أبسط وغالبًا أسرع. استخدم sync.Map عندما يوضح تحليل الأداء وجود تنافس، أو عندما يطابق نمط الوصول أهداف تحسينه.

LoadAndDelete

يحمّل LoadAndDelete القيمة ويحذف المفتاح ذريًا، ويعيد القيمة السابقة وما إذا كان المفتاح موجودًا.

v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }

sync.Map ليس عامًا

القيم المخزّنة في sync.Map من النوع any. غلّف sync.Map داخل بنية ذات نوع محدد، مع طرائق آمنة من ناحية النوع، لتجنب تناثر تأكيدات النوع في قاعدة الشيفرة.

اختبار سريع

ما الذي يضمنه sync.Once؟

مراجعة: sync.Once وsync.Map

النقاط الأساسية:

  • sync.Once: يشغّل دالة مرة واحدة بالضبط؛ ولا يمكن التراجع عنه
  • sync.Map: map متزامن مُحسّن لأنماط القراءة الكثيفة أو المفاتيح المنفصلة
  • استخدم أغلفة ذات أنواع محددة حول sync.Map لمزيد من الأمان

الأسئلة الشائعة

هل درس «‏sync.Once وsync.Map» مجاني؟

نعم — نص درس «‏sync.Once وsync.Map» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏sync.Once وsync.Map»؟

التهيئة لمرة واحدة والخرائط المتزامنة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏sync.Once وsync.Map»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. ‏sync.Mutex وsync.RWMutex
  2. ‏sync.WaitGroup
  3. ‏sync.Once وsync.Map
  4. كاشف حالات التنافس والأنماط الآمنة
← العودة إلى Go Academy