Go: новое в версиях
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: новое в версиях
В Go появляются в новых версиях новые и новые вещи. Некоторые из таких создают удобства, а другие даже радикально меняют картину Go. Из прошлых вещей, например:
- система поддержки модулей появляется в GoLang начиная с версии 1.11 (2018 год).
- дженерики появляются в GoLang появляются только в версии 1.18 (март 2022 года) ... хотя комментарий про использование дженериков ведутся ровно со дня выхода Go 10 ноября 2009 года ... т.е. 13 лет!
- в версии 1.18 в число предопределённых идентификаторов был введен новый тип any — синоним пустого интерфейса interface{}, означающего совместимость по присвоению с любым другим типом Go... после этой версии все пакеты репозитория GoLang «испещрены» этим типом.
- в версии Go 1.21 (август 2023 года) к числу предопределённых функций языка добавляется 3 новых: min, max, и clear. Функции min() и max() ... которые до тех пор, да и сейчас тоже, все реализуют вручную в качестве "примеров кода"
О примерном времени введения (или номере версии) каких-то особенностей нужно знять - может оказаться необходимым работать в разных версиях... Не у всех и не всегда стоит последняя (на сегодня это 1.22.1 ).
Например, компилятор TinyGo (текущая версия) работает если установлена версия GoLang по умолчанию с 1.18 по 1.21
Поэтому нужна такая вот тема о нововведениях по версиям (по крайней мере, по тем нововведениям ... которые мне ... приглянулись и пригодились )
- система поддержки модулей появляется в GoLang начиная с версии 1.11 (2018 год).
- дженерики появляются в GoLang появляются только в версии 1.18 (март 2022 года) ... хотя комментарий про использование дженериков ведутся ровно со дня выхода Go 10 ноября 2009 года ... т.е. 13 лет!
- в версии 1.18 в число предопределённых идентификаторов был введен новый тип any — синоним пустого интерфейса interface{}, означающего совместимость по присвоению с любым другим типом Go... после этой версии все пакеты репозитория GoLang «испещрены» этим типом.
- в версии Go 1.21 (август 2023 года) к числу предопределённых функций языка добавляется 3 новых: min, max, и clear. Функции min() и max() ... которые до тех пор, да и сейчас тоже, все реализуют вручную в качестве "примеров кода"
О примерном времени введения (или номере версии) каких-то особенностей нужно знять - может оказаться необходимым работать в разных версиях... Не у всех и не всегда стоит последняя (на сегодня это 1.22.1 ).
Например, компилятор TinyGo (текущая версия) работает если установлена версия GoLang по умолчанию с 1.18 по 1.21
Поэтому нужна такая вот тема о нововведениях по версиям (по крайней мере, по тем нововведениям ... которые мне ... приглянулись и пригодились )
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: новое в версиях
Это теперь встроенные функции языка (как len(), например). Функции с произвольным числом аргументов. Функции работают с любыми типами, для которых определены операции сравнения (<, >, ...):
Код: Выделить всё
package main
import "fmt"
func main() {
fmt.Println(min(3, 5, 8, 4, 2))
fmt.Println(min("строка", "страна", "странный"))
fmt.Println(max("строка", "страна", "странный"))
}
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/function$ go run minmax.go
2
страна
строка
- Вложения
-
- minmax.go
- (217 байт) 5 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: новое в версиях
С версии 1.22 (последней на сегодня) разрешена итерация range по целочисленному параметру (на манер Python).
Очеь удобно :
Это очень удобно
Кроме того, разрешена итерация в range по любому итератору в собственном коде, например, так:
Но это просто так не соберётся:
Это пока введено как "экспериментальная" возможность, в деталях реализации она может меняться ... И собирать это нужно так:
В итоге:
Очеь удобно :
Код: Выделить всё
package main
func main() {
for i := range 10 {
print(i, " ")
}
println()
}
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples/new.vers$ go run for.go
0 1 2 3 4 5 6 7 8 9
Кроме того, разрешена итерация в range по любому итератору в собственном коде, например, так:
Код: Выделить всё
package main
import "github.com/go-board/std/slices"
func main() {
arr := []int{1, 2, 3, 4, 5}
for x := range slices.Backward(arr) {
print(x, " ")
}
println()
}
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples/new.vers$ go run forit.go
# command-line-arguments
./forit.go:6:17: cannot range over slices.Backward(arr) (value of type iter.Seq[int])
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples/new.vers$ GOEXPERIMENT=rangefunc go build forit.go
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples/new.vers$ ./forit
5 4 3 2 1
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: новое в версиях
С версии 1.21 (август 2023 года) в состав стандартной библиотеки GoLang добавлен пакет slices. Он фактически не вводит ничего нового в сравнении с тем что можно сделать ручным прописанием кода, но делает запись операций со срезами компактнее и удобнее. А учитывая ту значимость, которую играют массивы и срезы в программном коде (на любом языке программирования) это вполне оправдано.
... теперь многие, посточнно употребимые, вещи не нужно прописывать вручную
Результаты:
Некоторые вещи там (в результатах) не совсем очевидные, поэтому краткие комментарии:
• В операции Delete() (4-я строка вывода) мы указываем индексы интервала удаляемых элементов, причём, 1-й параметр, начала интервала, указывается включительно, а 2-й, конца интервала — исключительно («до» элемента, но его не включая).
• В операции Insert() (5-я и 6-я строки вывода) можно в произвольное место среза вставить («раздвинув» последующие элементы) как одиночный элемент, так и срез таких элементов (во втором случае указание «...» в записи вызова — обязательно!).
• В операции Replace() указанный интервал элементов (индексы указываются как у Delete) мы можем замещать элементы указанного интервала замещаются на новые, причём, число замещаемых (старых) элементов и замещающих (новых) элементов могут не совпадать (в показаном примере 2 элемента заменились на 4).
• Во второй части примера (после подчёркивания) показано как функции пакета работают с строками string (как едиными цельными элементами среза).
• Мы можем видеть что вызов BinarySearch() работает только с элементами сортированного среза: первый показанный вызов не находит заведомо существующего элемента, и только после сортировки среза операция успешно выполняется.
• Такое поведение BinarySearch() полностью соответствует документации на пакет 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 — это поиск, ориентированный на быстрый бинарный поиск сортированных данных больших объёмов.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей