среда, 15 апреля 2020 г.

Два способа удалить элемент из среза в Golang

Быстрая версия (меняет порядок)

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) элементов и выполняется за линейное время.


Читайте также:


Комментариев нет:

Отправить комментарий