Страница 3 из 5
Go: инструментарий (продолжение)
Добавлено: 07 фев 2024, 19:56
Olej
Golang 1.22 Release: Comprehensive Guide to New Features and Enhancements
published on 27 December 2023
Улучшенная сборка мусора: повышена производительность и сокращена задержка.
...
Golang 1.22 представляет значительные улучшения в своем сборщике мусора. Обновление направлено на сокращение времени паузы и повышение общей производительности приложений, особенно тех, которые требуют высокой пропускной способности и низкой задержки. Это улучшение особенно полезно для крупномасштабных систем и облачных приложений.
Планировщик Go является неотъемлемой частью языка, управляя параллелизмом и оптимизируя загрузку ЦП. В версии 1.22 планировщик был усовершенствован для лучшего управления параллельными задачами, повышения эффективности и отзывчивости приложений Go.
Флаги компоновщика -s и -w теперь работают более согласованно на всех платформах. Флаг -w подавляет генерацию отладочной информации DWARF. Флаг -s подавляет генерацию таблицы символов. Флаг -s также подразумевает -w флаг, который может быть отменен с помощью -w=0. То есть, -s -w=0 сгенерирует двоичный файл с генерацией отладочной информации DWARF, но без таблицы символов.
На платформах ELF флаг -B компоновщика теперь принимает специальную форму: с помощью -B gobuildid компоновщик сгенерирует идентификатор сборки GNU (ELF NT_GNU_BUILD_ID примечание), производный от идентификатора сборки Go.
Как упоминалось в примечаниях к выпуску Go 1.20, для Go 1.22 теперь требуется финальная версия Go 1.20 или более поздней версии для bootstrap. Мы ожидаем, что для Go 1.24 потребуется финальная версия Go 1.22 или более поздней версии для bootstrap.
Нужно обновлять!
На то есть все резоны...
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 12:53
Olej
Olej писал(а): ↑07 фев 2024, 19:56
Нужно обновлять!
Обновляю репозиторий исходников GoLang:
Код: Выделить всё
olej@R420:~/goroot$ git fetch
remote: Finding sources: 100% (2168/2168)
remote: Total 2168 (delta 1162), reused 2160 (delta 1162)
Получение объектов: 100% (2168/2168), 3.11 МиБ | 379.00 КиБ/с, готово.
Определение изменений: 100% (1162/1162), завершено с 247 локальными объектами.
Из https://go.googlesource.com/go
e9b3ff15f4..2057ad02bd master -> origin/master
a95136a88c..90a870f1dc release-branch.go1.20 -> origin/release-branch.go1.20
2540b1436f..b214108e72 release-branch.go1.21 -> origin/release-branch.go1.21
66f8e1e817..20107e05a6 release-branch.go1.22 -> origin/release-branch.go1.22
* [новая метка] go1.20.14 -> go1.20.14
* [новая метка] go1.21.7 -> go1.21.7
* [новая метка] go1.22.0 -> go1.22.0
* [новая метка] go1.22rc2 -> go1.22rc2
Код: Выделить всё
olej@R420:~/goroot$ git branch
* (HEAD отделён на go1.21.3)
help
master
Код: Выделить всё
olej@R420:~/goroot$ git checkout go1.22.0
Предыдущая позиция HEAD была 883f062fc0 [release-branch.go1.21] go1.21.3
HEAD сейчас на a10e42f219 [release-branch.go1.22] go1.22.0
Код: Выделить всё
olej@R420:~/goroot$ git branch
* (HEAD отделён на go1.22.0)
help
master
ОК, теперь исходники - версии 1.22.0
Но со сборкой есть определённые проблемы
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 13:07
Olej
Olej писал(а): ↑09 фев 2024, 12:53
Но со сборкой есть определённые проблемы
Olej писал(а): ↑31 окт 2023, 20:31
Эта история известная ... И я в неё попадаю уже 2-й раз:
3-й раз
Installing Go from source
Фокус то вот в чём:
Код: Выделить всё
olej@R420:~/goroot$ go version
go version go1.21.3 linux/amd64
Код: Выделить всё
olej@R420:~/goroot$ update-alternatives --list go
/home/olej/goroot/bin/go
/lib/go-1.13/bin/go
/lib/go-1.18/bin/go
У меня текущий Go установлен (за счёт
alternatives) на
последнюю собранную версию
Код: Выделить всё
olej@R420:~/goroot/src$ ls -o /home/olej/goroot/bin/
итого 14572
-rwxrwxr-x 1 olej 12403876 янв 11 13:27 go
-rwxrwxr-x 1 olej 2513313 янв 11 13:27 gofmt
Вот - 11 января собиралась последняя версия 1.21.3
Но
нельзя собирать следующую версию 1.22.0 версию пользуясь файлом предыдущей версии 1.21.3, потому что сборка первейшим делом должна стереть этот файл
Нужно использовать предыдущую версию, установленную из пакетной системы дистрибутива
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 13:12
Olej
Olej писал(а): ↑09 фев 2024, 13:07
Нужно использовать предыдущую версию, установленную из пакетной системы дистрибутива
Вот - от 24 апреля 2023г. :
Код: Выделить всё
olej@R420:~/goroot/src$ ls -o /lib/go-1.18/bin/
итого 12236
-rwxr-xr-x 1 root 10238072 апр 24 2023 go
-rwxr-xr-x 1 root 2285944 апр 24 2023 gofmt
Делаем:
Код: Выделить всё
olej@R420:~/goroot/src$ export GOROOT_BOOTSTRAP=/lib/go-1.18; time ./all.bash
Building Go cmd/dist using /lib/go-1.18. (go1.18.1 linux/amd64)
found packages main (build.go) and building_Go_requires_Go_1_20_6_or_later (notgo120.go) in /home/olej/goroot/src/cmd/dist
real 0m0,217s
user 0m0,156s
sys 0m0,228s
И получаем следующий облом
Olej писал(а): ↑07 фев 2024, 19:56
Как упоминалось в примечаниях к выпуску Go 1.20, для Go 1.22 теперь требуется финальная версия Go 1.20 или более поздней версии для bootstrap. Мы ожидаем, что для Go 1.24 потребуется финальная версия Go 1.22 или более поздней версии для bootstrap.
И такая картина будет теперь повторяться дальше - от версии к версии
Верчсия 1.18.1 не годится для сборки, требуется врсия >=Go 1.20 ... а версия 1.21.3, собранная из исходников, не может быть использована
до тех пор пока она не будет установлена из GIT исходников GoLang в файловую систему Linux.
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 14:02
Olej
Olej писал(а): ↑09 фев 2024, 13:12
версия 1.21.3, собранная из исходников, не может быть использована до тех пор пока она не будет установлена из GIT исходников GoLang в файловую систему Linux.
Как это лучше сделать
Смотрим инсталляции, которые устанавливались apt из стандартных сборок своего дистрибутива:
Код: Выделить всё
olej@R420:/lib$ ls -od /lib/go-*
drwxr-xr-x 4 root 4096 янв 9 16:54 /lib/go-1.13
drwxr-xr-x 4 root 4096 апр 25 2023 /lib/go-1.18
Код: Выделить всё
olej@R420:/lib$ ls -o /lib/go-1.18
итого 12
lrwxrwxrwx 1 root 23 апр 14 2022 api -> ../../share/go-1.18/api
drwxr-xr-x 2 root 4096 апр 25 2023 bin
lrwxrwxrwx 1 root 36 апр 14 2022 doc -> ../../share/doc/golang-1.18-doc/html
lrwxrwxrwx 1 root 24 апр 14 2022 misc -> ../../share/go-1.18/misc
drwxr-xr-x 4 root 4096 янв 4 2023 pkg
lrwxrwxrwx 1 root 23 апр 14 2022 src -> ../../share/go-1.18/src
lrwxrwxrwx 1 root 24 апр 14 2022 test -> ../../share/go-1.18/test
-rw-r--r-- 1 root 8 апр 12 2022 VERSION
Код: Выделить всё
olej@R420:/lib$ ls -o /lib/go-1.18/bin
итого 12236
-rwxr-xr-x 1 root 10238072 апр 24 2023 go
-rwxr-xr-x 1 root 2285944 апр 24 2023 gofmt
Инсталляции довольно сложные и объёмные...
Можно конечно тупо:
- создать каталог /lib/go-1.21/bin
-
скопировать туда
собранные go + gofmt из:
Код: Выделить всё
olej@R420:/lib$ ls -o $(go env GOROOT)/bin
итого 14572
-rwxrwxr-x 1 olej 12403876 янв 11 13:27 go
-rwxrwxr-x 1 olej 2513313 янв 11 13:27 gofmt
- и самое главное, что новая версия Go 1.22 таким образом
соберётся ... но это грубо.
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 14:05
Olej
Olej писал(а): ↑09 фев 2024, 14:02
... но это грубо.
Или этого достаточно, учитывая текущую установку $GOROOT
:
Код: Выделить всё
olej@R420:/lib$ go env GOROOT
/home/olej/goroot
Код: Выделить всё
olej@R420:~/goroot$ ls -o $(go env GOROOT)
итого 72
drwxrwxr-x 2 olej 4096 фев 9 11:44 api
drwxrwxr-x 2 olej 4096 янв 11 13:27 bin
-rw-rw-r-- 1 olej 52 фев 9 11:44 codereview.cfg
-rw-rw-r-- 1 olej 1337 окт 31 18:06 CONTRIBUTING.md
drwxrwxr-x 2 olej 4096 фев 9 11:44 doc
-rw-rw-r-- 1 olej 505 окт 31 18:06 go.env
drwxrwxr-x 3 olej 4096 апр 30 2022 lib
-rw-rw-r-- 1 olej 1479 апр 30 2022 LICENSE
drwxrwxr-x 8 olej 4096 фев 9 11:44 misc
-rw-rw-r-- 1 olej 1303 апр 30 2022 PATENTS
drwxrwxr-x 4 olej 4096 янв 11 13:27 pkg
-rw-rw-r-- 1 olej 1455 янв 5 2023 README.md
-rw-rw-r-- 1 olej 426 фев 9 11:44 SECURITY.md
drwxrwxr-x 53 olej 4096 фев 9 11:44 src
drwxrwxr-x 26 olej 12288 фев 9 11:44 test
-rw-rw-r-- 1 olej 35 фев 9 11:44 VERSION
Код: Выделить всё
olej@R420:~/goroot$ ls -o /lib/go-1.18
итого 12
lrwxrwxrwx 1 root 23 апр 14 2022 api -> ../../share/go-1.18/api
drwxr-xr-x 2 root 4096 апр 25 2023 bin
lrwxrwxrwx 1 root 36 апр 14 2022 doc -> ../../share/doc/golang-1.18-doc/html
lrwxrwxrwx 1 root 24 апр 14 2022 misc -> ../../share/go-1.18/misc
drwxr-xr-x 4 root 4096 янв 4 2023 pkg
lrwxrwxrwx 1 root 23 апр 14 2022 src -> ../../share/go-1.18/src
lrwxrwxrwx 1 root 24 апр 14 2022 test -> ../../share/go-1.18/test
-rw-r--r-- 1 root 8 апр 12 2022 VERSION
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 14:31
Olej
Olej писал(а): ↑09 фев 2024, 14:02
новая версия Go 1.22
Для тех, кто не хочет заниматься сборкой из исходников ... готовые инсталляции GoLang от разработчиков (для самых разных платформ) здесь:
All releases + детальная инструкция бинарных инсталляций:
Download and install.
Скачиваем:
Код: Выделить всё
olej@R420:~/2024/Go$ ls -o go1.22.0.linux-amd64.tar.gz
-rw-rw-r-- 1 olej 68988925 фев 9 12:31 go1.22.0.linux-amd64.tar.gz
Там же для каждой инсталляции дана контрольная сумма:
SHA256 Checksum: f6c8a87aa03b92c4b0bf3d558e28ea03006eb29db78917daec5cfb6ec1046265
Проверяем:
Код: Выделить всё
olej@R420:~/2024/Go$ sha256sum go1.22.0.linux-amd64.tar.gz
f6c8a87aa03b92c4b0bf3d558e28ea03006eb29db78917daec5cfb6ec1046265 go1.22.0.linux-amd64.tar.gz
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 14:36
Olej
Olej писал(а): ↑09 фев 2024, 14:31
Скачиваем:
Эксперимент как это сработает - это действительно интересно
Olej писал(а): ↑09 фев 2024, 14:31
детальная инструкция бинарных инсталляций
Remove any previous Go installation by deleting the /usr/local/go folder (if it exists), then extract the archive you just downloaded into /usr/local, creating a fresh Go tree in /usr/local/go:
Код: Выделить всё
$ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
(You may need to run the command as root or through sudo).
Do not untar the archive into an existing /usr/local/go tree. This is known to produce broken Go installations.
Они устанавливают
всё дерево (из $GOROOT) в /usr/local/go.
Очень важно
предупреждение в последней строке
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 14:44
Olej
Olej писал(а): ↑09 фев 2024, 14:36
Они устанавливают всё дерево (из $GOROOT) в /usr/local/go.
С небольшими вариациями:
Код: Выделить всё
olej@R420:~$ ls /usr/local/go
ls: невозможно получить доступ к '/usr/local/go': Нет такого файла или каталога
Код: Выделить всё
root@R420:/home/olej/2024/Go# mkdir /usr/local/go
Код: Выделить всё
root@R420:/home/olej/2024/Go# tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
Код: Выделить всё
olej@R420:~$ ls -o /usr/local/go
итого 72
drwxr-xr-x 2 root 4096 фев 2 20:09 api
drwxr-xr-x 2 root 4096 фев 2 20:09 bin
-rw-r--r-- 1 root 52 фев 2 20:09 codereview.cfg
-rw-r--r-- 1 root 1337 фев 2 20:09 CONTRIBUTING.md
drwxr-xr-x 2 root 4096 фев 2 20:09 doc
-rw-r--r-- 1 root 505 фев 2 20:09 go.env
drwxr-xr-x 3 root 4096 фев 2 20:09 lib
-rw-r--r-- 1 root 1479 фев 2 20:09 LICENSE
drwxr-xr-x 8 root 4096 фев 2 20:09 misc
-rw-r--r-- 1 root 1303 фев 2 20:09 PATENTS
drwxr-xr-x 4 root 4096 фев 2 20:09 pkg
-rw-r--r-- 1 root 1455 фев 2 20:09 README.md
-rw-r--r-- 1 root 426 фев 2 20:09 SECURITY.md
drwxr-xr-x 53 root 4096 фев 2 20:09 src
drwxr-xr-x 26 root 12288 фев 2 20:09 test
-rw-r--r-- 1 root 35 фев 2 20:09 VERSION
Код: Выделить всё
olej@R420:~$ ls -o /usr/local/go/bin/
итого 14948
-rwxr-xr-x 1 root 12690016 фев 2 20:09 go
-rwxr-xr-x 1 root 2612839 фев 2 20:09 gofmt
Код: Выделить всё
olej@R420:~$ /usr/local/go/bin/go version
go version go1.22.0 linux/amd64
Go: инструментарий (продолжение)
Добавлено: 09 фев 2024, 15:10
Olej
Add /usr/local/go/bin to the PATH environment variable.
Olej писал(а): ↑09 фев 2024, 14:44
С небольшими вариациями:
Вместо прописывания в $PATH - добавление в альтернативы:
Код: Выделить всё
olej@R420:~$ update-alternatives --display go
go - автоматический режим
лучшая версия ссылки — /home/olej/goroot/bin/go
ссылка сейчас указывает на /home/olej/goroot/bin/go
ссылка go — /usr/bin/go
/home/olej/goroot/bin/go — приоритет 80
/lib/go-1.13/bin/go — приоритет 60
/lib/go-1.18/bin/go — приоритет 75
Добавить альтернативу:
Код: Выделить всё
olej@R420:~$ sudo update-alternatives --install /usr/bin/go go /usr/local/go/bin/go 85 --slave /usr/bin/gofmt gofmt /usr/local/go/bin/gofmt
update-alternatives: используется /usr/local/go/bin/go для предоставления /usr/bin/go (go) в автоматическом режиме
Код: Выделить всё
olej@R420:~$ update-alternatives --display go
go - автоматический режим
лучшая версия ссылки — /usr/local/go/bin/go
ссылка сейчас указывает на /usr/local/go/bin/go
ссылка go — /usr/bin/go
подчинённая gofmt — /usr/bin/gofmt
/home/olej/goroot/bin/go — приоритет 80
/lib/go-1.13/bin/go — приоритет 60
/lib/go-1.18/bin/go — приоритет 75
/usr/local/go/bin/go — приоритет 85
подчинённый gofmt: /usr/local/go/bin/gofmt
Код: Выделить всё
olej@R420:~$ go version
go version go1.22.0 linux/amd64