تخطَّ إلى المحتوى

weak.Pointer

مؤشّر ضعيف لا يمنع تحرير الذاكرة weak.Pointer

weak.Pointer يشير لقيمة دون منع جامع القمامة من تحريرها — مفيد لبناء ذواكر تخزين مؤقّت (caches) لا تُبقي كائنات حيّة بالذاكرة لمجرّد وجودها بالكاش.

المؤشّر العادي يبقي القيمة المُشار إليها قابلة للوصول (reachable)، فيمنع جامع القمامة من تحريرها طالما المؤشّر موجود. weak.Pointer عكس ذلك تمامًا: لا يُحسَب أصلًا بحساب الوصولية، فوجوده وحده لا يمنع تحرير القيمة. Value() تعيد المؤشّر الأصلي لو كانت القيمة ما زالت حيّة بمكان آخر (مؤشّر عادي يُبقيها)، أو nil لو حُرِّرت فعليًا. أُضيفت الحزمة بـ Go 1.24.

الاستخدام النموذجي: خريطة كاش تربط مفتاحًا بـ weak.Pointer لقيمة ضخمة — لو لم يستخدمها أحد بمؤشّر عادي بمكان آخر، جامع القمامة يحرّرها بحرّية، والكاش نفسه لا يمنع ذلك.

الصياغة

func Make[T any](ptr *T) Pointer[T]
func (p Pointer[T]) Value() *T

📄 مثال

cache := map[string]weak.Pointer[BigData]{}

func Get(key string) *BigData {
  if wp, ok := cache[key]; ok {
    if data := wp.Value(); data != nil {
      return data   // ما زالت حيّة، مُستخدَمة بمكان آخر
    }
  }
  data := loadBigData(key)
  cache[key] = weak.Make(data)
  return data
}

أهم النقاط

العنصرالوظيفة
weak.Make(ptr)ينشئ مؤشّرًا ضعيفًا من مؤشّر عادي — لا يمنع تحرير القيمة المشار إليها
wp.Value()يعيد المؤشّر الأصلي إن كانت القيمة ما زالت حيّة بمكان آخر، أو nil إن حُرِّرت

💡 نصائح عملية

  • استخدم weak.Pointer فقط داخل بنى تخزين مؤقّت أو خرائط ربط (canonicalization) — ليست بديلًا عاديًا للمؤشّرات بمنطق التطبيق اليومي
  • لا تعتمد على أن Value() ستعيد nil حتمًا فور تحرير الكائن — التوقيت يعتمد على جامع القمامة، والضمان الوحيد أنها لن تُبقي الكائن حيًّا

⚠️ أخطاء شائعة

  • الظن أن weak.Pointer يعمل كمرجع عادي يمنع التحرير مؤقّتًا — هي بالضبط عكس ذلك، لا تُحسب أصلًا بحساب الوصولية
  • استخدامها لكائنات صغيرة جدًا بلا مؤشّرات داخلية وتوقّع تحريرها فورًا — كائنات كهذه قد لا تُحرَّر أبدًا عمليًا لأسباب داخلية بجامع القمامة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.