أسئلة وأجوبة

كيف تحذف عناصر متتالية من شريحة بكفاءة مع الحفاظ على ترتيب العناصر؟

افترض:

  1. أن الشريحة المعنية هي s ونوعها []E، حيث E هو نوع عنصر الشريحة.
  2. أننا نريد حذف العناصر في الشريحة الفرعية s[from:to] مع from <= to.

الطريقة 1: استخدام الدالة المضمّنة copy


	s = s[:from + copy(s[from:], s[to:])]

الطريقة 2: استخدام الدالة المضمّنة append


	s = append(s[from:], s[to:]...)

الطريقة 3: استخدام دالة slices.Delete (منذ Go 1.21)


import "slices"

	s = slices.Delete(s, from, to)

بعض الملاحظات

ملاحظة 1

هناك تفصيل ينبغي أن ننتبه له:

لذا تُفضَّل الطريقة الأولى على الطريقة الثانية.

لاحظ أنه في Go 1.21، كان تنفيذ دالة slices.Delete مطابقاً للطريقة 2. لذا كان أيضاً غير فعّال عندما from == to. منذ Go 1.22، أُزيلت المشكلة.

(جُمع هذا التفصيل في كتاب Go Optimizations 101.)

ملاحظة 2

إذا كان من المهم محاولة تقصير عمر القيم الأخرى التي تشير إليها العناصر المحرَّرة (والتي تحتوي على مؤشرات)، فإننا نحتاج إلى فعل المزيد (في الطريقتين 1 و 2 معاً) عبر تفريغ العناصر المحرَّرة بإحدى الصيغتين التاليتين:

الصيغة 1 (منذ Go 1.21):


	// قُدّمت الدالة المضمّنة "clear" في Go 1.21.
	clear(s[len(s):len(s)+to-from])

الصيغة 2 (افترض أن القيمة الحرفية الصفرية لـ E هي zeroE):


	{
		temp := s[len(s):len(s)+to-from]
		for i := range temp {
			temp[i] = zeroE
		}
	}

إذا استُخدمت سلسلة أدوات Go 1.21، فينبغي أن نفرّغ العناصر المحرَّرة بأنفسنا أيضاً بعد استدعاء دالة slices.Delete (بإحدى الصيغتين أعلاه). منذ Go 1.22، ستفرّغ دالة slices.Delete العناصر المحرَّرة تلقائياً.