Go: новое в версиях

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: новое в версиях

Непрочитанное сообщение Olej » 15 мар 2024, 10:28

В 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() ... которые до тех пор, да и сейчас тоже, все реализуют вручную в качестве "примеров кода" :lol:

О примерном времени введения (или номере версии) каких-то особенностей нужно знять - может оказаться необходимым работать в разных версиях... Не у всех и не всегда стоит последняя (на сегодня это 1.22.1 :!: ).
Например, компилятор TinyGo (текущая версия) работает если установлена версия GoLang по умолчанию с 1.18 по 1.21

Поэтому нужна такая вот тема о нововведениях по версиям (по крайней мере, по тем нововведениям ... которые мне ... приглянулись и пригодились :lol: )

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: новое в версиях

Непрочитанное сообщение Olej » 15 мар 2024, 10:41

Olej писал(а):
15 мар 2024, 10:28
- в версии Go 1.21 (август 2023 года) к числу предопределённых функций языка добавляется 3 новых: min, max, и clear.
Это теперь встроенные функции языка (как 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: новое в версиях

Непрочитанное сообщение Olej » 15 мар 2024, 10:57

С версии 1.22 (последней на сегодня) разрешена итерация range по целочисленному параметру (на манер Python).
Очеь удобно :-D :!: :

Код: Выделить всё

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 
Вложения
for.go
(81 байт) 5 скачиваний
forit.go
(168 байт) 5 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: новое в версиях

Непрочитанное сообщение Olej » 15 мар 2024, 11:29

С версии 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 — это поиск, ориентированный на быстрый бинарный поиск сортированных данных больших объёмов.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей