С версии 1.21 (август 2023 года) в состав стандартной библиотеки GoLang добавлен пакет slices. Он фактически не вводит ничего нового в сравнении с тем что можно сделать ручным прописанием кода, но делает запись операций со срезами компактнее и удобнее. А учитывая ту значимость, которую играют массивы и срезы в программном коде (на любом языке программирования) это вполне оправдано.
Код: Выделить всё
package main
import (
"fmt"
"slices"
)
func main() {
showd := func(s []int) {
fmt.Printf("%v <%02d:%02d>\n", s, len(s), cap(s))
}
digs := []int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2}
showd(digs)
fmt.Println(slices.Max(digs), slices.Min(digs))
// func Sort[S ~[]E, E cmp.Ordered](x S)
slices.Sort(digs)
showd(digs)
// func Delete[S ~[]E, E any](s S, i, j int) S
digs = slices.Delete(digs, 2, 5)
showd(digs)
// func Insert[S ~[]E, E any](s S, i int, v ...E) S
digs = slices.Insert(digs, 2, 22)
showd(digs)
digs = slices.Insert(digs, 5, []int{31, 32, 33}...)
showd(digs)
// func Reverse[S ~[]E, E any](s S)
slices.Reverse(digs)
showd(digs)
digs = slices.Replace(digs, 2, 4, -11, -12, -13, -14)
showd(digs)
println("-----------------------------")
names := []string{"Иван", "Николай", "Алиса", "Боб"}
fmt.Println(names)
// func IsSorted[S ~[]E, E cmp.Ordered](x S) bool
fmt.Println(slices.IsSorted(names))
const term = "Иван"
// func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool)
n, found := slices.BinarySearch(names, term)
fmt.Println(term, n, found)
slices.Sort(names)
fmt.Println(names)
fmt.Println(slices.IsSorted(names))
n, found = slices.BinarySearch(names, term)
fmt.Println(term, n, found)
}
... теперь многие, посточнно употребимые, вещи не нужно прописывать вручную
Результаты:
Код: Выделить всё
$ go run slice3.go
[9 8 7 6 5 4 3 2 1 0 -1 -2] <12:12>
9 -2
[-2 -1 0 1 2 3 4 5 6 7 8 9] <12:12>
[-2 -1 3 4 5 6 7 8 9] <09:12>
[-2 -1 22 3 4 5 6 7 8 9] <10:12>
[-2 -1 22 3 4 31 32 33 5 6 7 8 9] <13:24>
[9 8 7 6 5 33 32 31 4 3 22 -1 -2] <13:24>
[9 8 -11 -12 -13 -14 5 33 32 31 4 3 22 -1 -2] <15:24>
-----------------------------
[Иван Николай Алиса Боб]
false
Иван 4 false
[Алиса Боб Иван Николай]
true
Иван 2 true
Некоторые вещи там (в результатах) не совсем очевидные, поэтому краткие комментарии:
• В операции Delete() (4-я строка вывода) мы указываем индексы интервала удаляемых элементов, причём, 1-й параметр, начала интервала, указывается включительно, а 2-й, конца интервала — исключительно («до» элемента, но его не включая).
• В операции Insert() (5-я и 6-я строки вывода) можно в произвольное место среза вставить («раздвинув» последующие элементы) как одиночный элемент, так и срез таких элементов (во втором случае указание «...» в записи вызова — обязательно!).
• В операции Replace() указанный интервал элементов (индексы указываются как у Delete) мы можем замещать элементы указанного интервала замещаются на новые, причём, число замещаемых (старых) элементов и замещающих (новых) элементов могут не совпадать (в показаном примере 2 элемента заменились на 4).
• Во второй части примера (после подчёркивания) показано как функции пакета работают с строками string (как едиными цельными элементами среза).
• Мы можем видеть что вызов BinarySearch() работает только с элементами сортированного среза: первый показанный вызов не находит заведомо существующего элемента, и только после сортировки среза операция успешно выполняется.
• Такое поведение BinarySearch() полностью соответствует документации на пакет slices — это поиск, ориентированный на быстрый бинарный поиск сортированных данных больших объёмов.