LINUX.ORG.RU

Выпуск Go 1.22

 ,


1

3

Представлен релиз языка программирования Go 1.22, который развивается компанией Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Код проекта распространяется под лицензией BSD.

Синтаксис Go основан на привычных элементах языка Си с отдельными заимствованиями из языка Оберон. Язык достаточно лаконичен, но при этом код легко читается и воспринимается. Код на языке Go компилируется в обособленные бинарные исполняемые файлы, выполняемые нативно, без использования виртуальной машины (модули профилирования, отладки и другие подсистемы выявления проблем на этапе выполнения интегрируются в виде runtime-компонентов), что позволяет добиться производительности, сопоставимой с программами на языке Си.

Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, в том числе предоставляя реализованные на уровне операторов средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за допустимые области выделенных блоков памяти и обеспечивает возможность использования сборщика мусора.

Среди изменений в новом выпуске:

  • В циклы «for» добавлена поддержка определения диапазонов из целых чисел, например, для перебора значений с 0 до 9 теперь можно использовать цикл «for i := range 10 {...}».
  • В циклы «for» добавлена экспериментальная (GOEXPERIMENT=rangefunc) поддержка функций определения диапазона, позволяющая указывать функцию в качестве итератора. Например, «for i, x := range slices.Backward(s) {...}»
  • Решена давняя проблема с циклами «for», приводившая при вызове сопрограмм (goroutine) к совместному использованию переменных цикла в разных итерациях. Например, код
          values := []string{"a", "b", "c"}
          for _, v := range values {
               go func() {
                   fmt.Println(v)
                  done <- true
               }()
          }
    теперь будет выводить «a»,«b» и «c», а не только «c», как было раньше.
  • Проведена оптимизация работы с памятью в runtime, которая привела к повышению производительности на 1-3% и снижению потребления памяти в большинстве приложений на 1%.
  • Продолжена работа по задействованию в компиляторе оптимизаций на основе результатов профилирования кода (PGO - Profile-guided optimization), позволяющих учитывать особенности, определяемые во время выполнения программы. В новой версии в компиляторе задействованы средства девиртуализации для замены непрямых вызовов различных методов на выполнение развёрнутых inline-блоков.
  • При включении PGO добавленное изменение позволило повысить производительность большинства программ на 2-14%.
  • В компилятор добавлена экспериментальная (GOEXPERIMENT=newinliner) улучшенная реализация механизма развёртывания (inlining) вызовов, использующая эвристику для разделения важных и второстепенных операций.
  • В стандартную библиотеку добавлен пакет «math/rand/v2», в котором предложен более целостный API и задействованы более быстрые алгоритмы генерации псевдо-случайных чисел.
  • В пакет net/http.ServeMux добавлена возможность указания методов и масок в шаблонах, например, шаблон «GET /static/{id}/» будет применён к запросам с HTTP-методом «GET» и сохранит значение второго сегмента запрошенного пути в идентификаторе «id».
  • В пакет database/sql добавлена поддержка типа Null[T], позволяющего сканировать столбцы, которые могут принимать значение NULL. В пакет slices добавлена функция Concat для слияния нескольких слайсов любого типа.
  • В командах для работы с рабочими пространствами (коллекциями модулей) предоставлена возможность использования каталога «vendor», содержащего зависимости к содержимому рабочего пространства. Каталог создаётся при выполнении команды «go work vendor» и используется в сборочных командах при выставлении опции "-mod=vendor" (включает по умолчанию при наличии каталога vendor).

Изменения в поведении утилит.

  • go get больше не поддерживается за пределами модуля в устаревшем GOPATH режиме (то есть с GO111MODULE=off). Другие команды сборки, такие как go build и go test, будут продолжать работать для устаревших GOPATH программ в течение неопределенного времени.
  • go mod init больше не пытается импортировать требования к модулям из файлов конфигурации для других инструментов поставщиков (таких как Gopkg.lock).
  • go test -cover теперь печатает сводные данные о покрытии для покрываемых пакетов, у которых нет собственных тестовых файлов. До Go 1.22 go test -cover для такого пакета сообщал бы
    ? mymod/mypack [no test files]

    и теперь с Go 1.22 функции в пакете считаются непокрытыми:

    mymod/mypack coverage: 0.0% of statements
    
    Обратите внимание: если пакет вообще не содержит исполняемого кода, мы не можем сообщить о значимом проценте покрытия; для таких пакетов go test будет продолжать сообщать об отсутствии тестовых файлов.

  • Веб-интерфейс инструмента trace был слегка обновлен в рамках работы по поддержке нового трассировщика, решены некоторые проблемы и улучшена читабельность различных страниц. Веб-интерфейс теперь поддерживает изучение трассировок в поточно-ориентированном представлении. Средство просмотра трассировки теперь также отображает полную продолжительность всех системных вызовов. Эти улучшения применимы только для просмотра трассировок, созданных программами, созданными на Go 1.22 или новее. В будущем выпуске некоторые из этих улучшений будут внесены в трассировки, создаваемые старой версией Go.
  • Среда выполнения теперь хранит метаданные сборки мусора на основе типов ближе к каждому объекту кучи. Это изменение также снижает затраты памяти большинства программ Go примерно на 1% за счет дедупликации избыточных метаданных. В некоторых программах улучшение может быть меньшим, поскольку это изменение корректирует границы класса размера распределителя памяти, поэтому некоторые объекты могут быть перемещены на класс размера выше. Следствием этого изменения является то, что адреса некоторых объектов, которые раньше всегда были выровнены по границе 16 байт (или выше), теперь будут выровнены только по границе 8 байт. Некоторые программы, использующие инструкции ассемблера, требующие, чтобы адреса памяти были выровнены по размеру более 8 байт и полагаются на предыдущее поведение выравнивания распределителя памяти, могут выйти из строя, но мы ожидаем, что такие программы будут редки. Такие программы могут быть созданы с GOEXPERIMENT=noallocheaders с возможностью возврата к старой модели метаданных и восстановления предыдущего поведения выравнивания, но владельцам пакетов следует обновить свой ассемблерный код, чтобы избежать предположения о выравнивании, поскольку этот обходной путь будет удален в будущем выпуске.
  • Как упоминалось в примечаниях к выпуску Go 1.20, Go 1.22 теперь требует финальной версии Go 1.20 или новее для начальной сборки. Мы ожидаем, что Go 1.24 потребует финальной версии Go 1.22 или более поздней версии для начальной сборки.
    Оригинал (go.dev)

>>> Подробности (OpenNet)

★★★★★

Проверено: hobbit ()

Мне не нравится Go

Мне смешна твоя ложь

Методичек гугла

Мне не нравится Пайк

Он похож на тебя

Так похож на тебя

perl5_guy ★★★★★
()
Последнее исправление: perl5_guy (всего исправлений: 1)
Ответ на: комментарий от perl5_guy

! Мне не нравится Go

Ну да, в гоу соорудили свою песочницу и варятся в ней
Я например не понимаю до сих пор, как работают мьютексы в гоурутинах - в том смысле, что такая гоурутина может пожирать память со страшной силой

И кстати, какова роль сообщества в развитии языка ?

kto_tama ★★★★★
()
Последнее исправление: kto_tama (всего исправлений: 1)

Такое ощущение, что в Go пытаются сделать for ни на что не похожим и выходит максимум всрато и нелогично.

MoldAndLimeHoney
()

Такие программы могут быть созданы с GOEXPERIMENT=noallocheaders

Положи промт на место.

А ты, @hobbit, влепи ему +0.

intelfx ★★★★★
()
Ответ на: комментарий от MoldAndLimeHoney

Нет, это ответка Oberon, где цикла for нет в принципе. А гошный мне удобным показался если запомнить, что выдает range в том или ином случае

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от dmitry237

Там два оператора присваивания: := с выводом типа и = как инициализация объявленной переменной. Сравнение - это ==.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от dmitry237

Почему оператор присваивания :=? Просто = применяется для сравнения?

:= для декларации и инициализации:

а := 42

= для переприсваивания

а := 42
// 
а = b+2 

и ещё вот для такой инициализации:

var a int = 42

Всрато, согласен, но привыкаешь.

her_s_gory
()
Ответ на: комментарий от dataman

Часть взял оттуда, часть с официального сайта.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от dmitry237

:= не просто присваивает, но и определяет используемый тип данных. = этого не делает, надо указать его явно.

x := "text"
var y string = "text"
Ghostwolf ★★★★
()
Ответ на: комментарий от Shadow

От Питона там нет практически ничего:

Испытал влияние: Си, Оберон-2, Limbo, Active Oberon, BCP, Паскаль, Оберон, Smalltalk, Newsqueak, Модула-2, Alef, APL, BCPL, Модула и Оккам

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

В циклы «for» добавлена поддержка определения диапазонов из целых чисел, например, для перебора значений с 0 до 9 теперь можно использовать цикл «for i := range 10 {...}». В циклы «for» добавлена экспериментальная (GOEXPERIMENT=rangefunc) поддержка функций определения диапазона, позволяющая указывать функцию в качестве итератора. Например, «for i, x := range slices.Backward(s) {...}»

- пофиг на влияние, в питоне все циклы такие, а не как в алголоподобных. Теперь их не надо переписывать, а только синтаксис изменить.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Вообще на логичный и лаконичный питон не похоже. Про Го говорят «простой язык», а на деле даже банальные конструкции работают по-другому, и этот for уже сколько лет так работал.

ac130kz
()
Ответ на: комментарий от MoldAndLimeHoney

это определяется как «на зло» и «наоборот». Что-бы залечить молодежи что нормальные технологии сложны и не быстры, а потом выставлять рэволюционеров виноватыми за write-only казуально работающий результат

Syncro ★★★★★
()
Последнее исправление: Syncro (всего исправлений: 1)

что позволяет добиться производительности, сопоставимой с программами на языке Си.

Ага жди.

P.S. Ну и чтобы подлить маслица в огонь, нужно было написать что это нормальный ОО язык у которого нет классов, так как они не нужны.

mx__ ★★★★★
()
Ответ на: комментарий от ac130kz

«Простой язык» про него говорял либо гуглоагитаторы, либо копипастеры которым пофиг что копипастить. Нормальные люди про него говорят «убогий язык».

firkax ★★★★★
()
Ответ на: комментарий от kto_tama

Если в Вас горутина пожирает память со страшной силой, значит вы что-то делаете не так.

thegoldone
()
Ответ на: комментарий от Syncro

Согласен, ну так в одной новости пишут сразу про сборщик и про скорость … нужно что то одно писать тогда уж.

mx__ ★★★★★
()
Ответ на: комментарий от ergo

‘:=‘ - define and assign

это называется инишалайз

Syncro ★★★★★
()
Ответ на: комментарий от her_s_gory

Всрато, согласен, но привыкаешь.

Поразительно как часто приходится это про Go слышать. На первой же странице этого треда уже два раза использовано.

Gentooshnik ★★★★★
()
Ответ на: комментарий от mx__

Ага, скорость разработки, скорость накопления средств на заказ разработки и всё остальное.

thegoldone
()
Ответ на: комментарий от her_s_gory

Вот зачем? Зачем этот :=? Ну есть же инициализация с указанием типа, ну оставьте одну, одну, блин, кoнструкцию, она понятная, она простая, она самодокументируемая.

Нет, надо вот этого вот… типа если вы в блоке объявляете счётчик, ну чтобы попроще побыстрее давайте:=. 🤦🏻‍♂️

beck ★★★★
()
Последнее исправление: beck (всего исправлений: 1)
Ответ на: комментарий от firkax

Нормальные люди не посвящают своё время обсуждению языков, которые они считают убогими :)

Ghostwolf ★★★★
()
Ответ на: комментарий от Gentooshnik

Всрато кажется на фоне того, к чему привык в других местах. А когда привыкаешь к тому, как это сделано в го, всратость теряется. Просто потому что всратость это не какой-то объективный параметр, а субъективное восприятие, которое меняется по мере знакомства с языком и привыкания к нему.

Ghostwolf ★★★★
()
Последнее исправление: Ghostwolf (всего исправлений: 1)
Ответ на: комментарий от LongLiveUbuntu

От Питона там нет практически ничего

А как же фанбои? 😏

X-Pilot ★★★★★
()
Ответ на: комментарий от t3mnikov

Java/JVM-языки (если нужен адекватный GC, модель памяти и потоки) или Rust (если GC вообще противопоказан и нужна максимальная скорость работы)

X-Pilot ★★★★★
()
Ответ на: комментарий от mx__

что позволяет добиться производительности, сопоставимой с программами на языке Си.

Ага жди.

Ну это похоже на правду. У меня, например, простенький числодробильный тестик для С++ и Go показывает одинаковую скорость.

AlexLorovitch
()
Ответ на: комментарий от X-Pilot

с каких это пор онанировать аллокатором через блокирующие прерывания на каждом блоке стало максимально быстро?

Syncro ★★★★★
()
Ответ на: комментарий от AlexLorovitch

в с++ (не в Си) такой же инстантный гц на подсчете ссылок

Syncro ★★★★★
()
Последнее исправление: Syncro (всего исправлений: 1)
Ответ на: комментарий от demosch

Лучше не привыкать к такому, а то потом можешь внезапно словить баги в неожиданных местах, если оставишь тип на усмотрение компилятора (типы float* int*)

ergo ★★★
()
Ответ на: комментарий от beck

Вот зачем? Зачем этот :=?

Я всего-лишь ответил на вопрос «какая разница между = и :=». Зачем - это где-то написано, но лично мне всё равно. Просто пишу код по правилам и всё.

her_s_gory
()

Странно, что еще не написали. Ну я тогда напишу:

НИНУЖНО, большое ЛОРовское НИНУЖНО!

gns ★★★★★
()
Ответ на: комментарий от AlexLorovitch

А С++ причем тут ? Разговор вроде про Си.

Вот реализуйте на Go, и поглядите. Почему Rust в 2 раза медленнее Си?

P.S. У вас либу на си не дергали ? А то начинают писать на питоне не медленне а сами юзают какой нибудь mathlab внутри.

mx__ ★★★★★
()
Ответ на: комментарий от ergo

Изначальный вопрос. Его вопрошающий. Он вообще его задал непонятно зачем. Судя по всему это просто праздный интерес мимоходом. Не вижу смысла тонкости языка объяснять в ответе. Да ещё и в подробностях. Для этого есть множество удобных и кратких источников в интернете, которые легко находятся при минимальном желании.

thegoldone
()
Ответ на: комментарий от Gentooshnik

Он просто не в теме что у Оберона и Паскаля один создатель …

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Даже если дёргали, то что? В конечном итоге, если питон или го позволяют дёргать либы на си, и при этом писать код в разы быстрее и безопаснее, то это плюс, а не минус.

Ghostwolf ★★★★
()
Ответ на: комментарий от ergo

Для переменных – это int, float64 или string.
Для постоянных – untyped int, untyped float или untyped string.
Строго.

P.S.: а для комплексных чисел – complex128.

thegoldone
()
Последнее исправление: thegoldone (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.