Быстрая версия (меняет порядок)
a := []string{"A", "B", "C", "D", "E"}
i := 2
// Удалить элемент по индексу i из a.
// 1. Копировать последний элемент в индекс i.
a[i] = a[len(a)-1]
// 2. Удалить последний элемент (записать нулевое значение).
a[len(a)-1] = ""
// 3. Усечь срез.
a = a[:len(a)-1]
fmt.Println(a) // [A B E D]
Код копирует один элемент и выполняется за постоянное время.
Медленная версия (сохраняет порядок)
a := []string{"A", "B", "C", "D", "E"}
i := 2
// Удалить элемент по индексу i из a.
// 1. Выполнить сдвиг a[i+1:] влево на один индекс.
copy(a[i:], a[i+1:])
// 2. Удалить последний элемент (записать нулевое значение).
a[len(a)-1] = ""
// 3. Усечь срез.
a = a[:len(a)-1]
fmt.Println(a) // [A B D E]
Код копирует (len(a) - i - 1) элементов и выполняется за линейное время.
Читайте также:
- Массивы, срезы и строки: механика работы append в Golang
- Срезы в Golang: внутреннее устройство и использование
- Эффективный Go: срезы (slices)
Комментариев нет:
Отправить комментарий