افترض:
- أن الشريحة المعنية هي
sونوعها[]E، حيثEهو نوع عنصر الشريحة. - أننا نريد حذف العناصر في الشريحة الفرعية
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
هناك تفصيل ينبغي أن ننتبه له:
- عندما
from < to، تكون الطريقتان السابقتان متساويتين في الأداء. - عندما
from == to، تكون الطريقة الأولى تقريباً عملية بلا تأثير، لكن الطريقة الثانية ليست كذلك.
لذا تُفضَّل الطريقة الأولى على الطريقة الثانية.
لاحظ أنه في 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 العناصر المحرَّرة تلقائياً.