LINUX.ORG.RU

Go 1.26

 , ,

Go 1.26

0

5

После полугода разработки состоялся выпуск 1.26 компилятора и стандартной библиотеки языка программирования Go.

Основные изменения:

  • Встроенная новая функция, создающая новую переменную, позволяет использовать в качестве операнда выражение, указывающее начальное значение переменной. Простой пример такого изменения — это код, подобный этому:
    x := int64(300)
    ptr := &x
    

    Можно упростить до:
    ptr := new(int64(300))
    
  • Обобщенные типы могут ссылаться сами на себя в собственном списке параметров типа. Это изменение упрощает реализацию сложных структур данных и интерфейсов.

Улучшение производительности:

  • Экспериментальный сборщик мусора Green Tea теперь включен по умолчанию.
  • Накладные расходы на CGO были сокращены примерно на 30%.
  • Компилятор может выделять резервную память для Slice-структур в стеке в большем количестве ситуаций, что повышает производительность.

Инструментарий:

  • Команда go fix была полностью переписана с использованием фреймворка analysis и теперь включает в себя несколько десятков «модернизаторов», которые предлагают безопасные исправления, помогающие вашему коду использовать преимущества новых возможностей языка и стандартной библиотеки.

Добавлены экспериментальные дополнения, доступные только при явном включении:

  • Пакет archsimd для доступа к архитектурно-зависимым операциям SIMD. На данный момент поддерживается только AMD64.
  • Пакет secret со вспомогательными функциями для обнуления памяти.
  • В пакет профилирования pprof добавлена поддержка опции GOEXPERIMENT=goroutineleakprofile для обнаружения утечек goroutine.


>>> Полный список изменений

>>> Подробности на go.dev/blog

★★★★★

Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 9)
Ответ на: комментарий от Obezyan

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

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

PHP — игрушечный язык для маленьких неответственных проектов, чтобы те, кто не умеют писать на настоящих языках программирования, тоже могли принести пользу обществу.

Всё так. Но что в этом плохого то? Это важная ниша.

Не знаю что может это изменить.

И не надо это менять.

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

PHP совершил качественный скачок став в 2–3 раза быстрее старых версий и в некоторых задачах вплотную приближается к компилируемым языкам.

Где-то тут враньё. Разрыв между пхп и си не в 2-3 раза, а раз примерно в 100. Пхп спасает то, что на нём обычно пишут не алгоритмы, а клей для более низкоуровневых кирпичиков, который сам по себе имеет малую долю в общем потреблении проца.

высоконагруженные системы на PHP теперь обходятся дешевле в обслуживании, чем аналоги на Python или Ruby.

Думаю это и раньше так было. Питон и руби та же скриптота, только ещё и неудобная.

Помимо этого, PHP перестал быть языком «пиши как хочешь».

А вот это - «пиши как хочешь» - всегда было его киллер-фичей. Так что, как я уже выше писал, последние изменения в пхп идут ему только во вред. Свою нишу так и потерять можно, а с ЯП в их нише он всё равно никогда конкурировать не сможет.

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

В общем случае нет. При смене мажорной версии обычно что-то ломают в обратной совместимости. Используется ли это что-то в конкретном проекте надо смотреть. Обычно в версии -1 это что-то было deprecated и писало в лог соответствующее предупреждение

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

Репорты

Мы делали фин отчёты на клике под прослойкой Go.

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

Это запрещено, чтобы не возникло указателей на стек. Которые потом уходят за пределы вызова.

А в примере с x := int64(300) из текста новости - какой именно механизм говорит что x размещается в куче, а не на стеке? (не знаю деталей go)

я думаю что предложенный синтаксис &int64(300) мог бы обеспечивать использование кучи для размещения возвращаемого из функции значения

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

Я не очень понимаю в чём вообще претензия к го. В го сборщик мусор. Это по-умолчанию не самый быстрый язык и, если упираться в сборку мусора, не самый удобный. Какие-то непредвиденные кейсы будут страдать. В этом, наверное, даже C будет удобнее. Но это нишевый кейс, который не делает язык C самым лучшим на свете.

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

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

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

А в примере с x := int64(300) из текста новости - какой именно механизм говорит что x размещается в куче, а не на стеке? (не знаю деталей go)

Это escape analyzer решает. Если он увидит, что объект уходит куда-то, то разместит его на куче. Иначе на стеке.

Я, кстати там, ошибся. Не от аргумента, а от возвращаемого значения нельзя получить адрес.

package main

import (
	"fmt"
)

type User struct {
	Name string
	Age  int
}

func Ptr[T any](a T) *T {
	return &a
}

func ptr(a int) *int {
	return &a
}

func get3() int {
	return 3
}

func alice() User {
	return User{"Alice", 19}
}

func some(x int, y User) {

	var (
		a = &User{"Alex", 21} // ok
		b = &x                // ok
		c = &y                // ok
		d = ptr(3)            // ok
		e = Ptr(3)            // ok
		f = &get3()           // invalid operation: cannot take address of get3() (value of type int)
		g = &3                // invalid operation: cannot take address of 3 (untyped int constant)
		h = &alice()          // invalid operation: cannot take address of alice() (value of struct type User)
	)

	fmt.Println("Hello,", a, b, c, d, e, f, g, h)
}

func main() {
	some(1, User{"Eva", 20})
}

go.dev/play

Прикол в том, что &User{} нормально. А &3 – нет. И об этом даже Роб Пайк уже писал, возмущался. И было предложение это всё разрешить делать.


Что касается &int64(300) и &300 – это запрещено, чтобы избежать дрисни вида t := &(a + 15 + x^10 + b&7).

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

Нет, не дало бы, если они уже упёрлись в ограничения гошного рантайма.

Для случая Дискорда в итоге они упёрлись конкретно в свою реализацию. У меня 500 млн записей в хэш-таблице не давали никакой задержки на сборке мусора вообще.

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

я не автор сообщения, кому ты ответил, но на мой взгляд его утверждение абсолютно верно

А на мой взгляд не верно.

даже не вникая в языковые конструкции можно сравнить порог входа. несопоставимо выше у джавы

Я на Java начал писать примерно через 5 минут после знакомства с ней. Будучи студентом, работающим на полставки. Я не знаю, о каком пороге входе речь. У джавы он точно околонулевой. У го чуть больше, но, конечно, тоже не намного, я лично го выучил примерно за час, полистав официальный сайт. Так что по личному примеру могу оценить порог входа в Го примерно в 12 раз выше чем в Java.

а если еще сравнить не только языковые конструкции, но и набор аргументов для jvm (в свое время намучался с тюнингом кассандры), то это как пушинка против бульдозера.

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

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

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

Раньше была мода на собеседованиях спрашивать про настройку ГЦ. Никто его не настраивал, но все спрашивали. Кажется, сейчас уже эта мода прошла.

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

Попробовал я составить план объяснения hello world. Рассмотрел три языка: C, Go, Pascal (в последнюю очередь). Это невозможно сделать хорошо на C или Go. То, что программисту кажется просто — не просто для обычного человека. Вместо простой вводной приходится говорить «потом узнаешь что это такое» (а эта вещь имеет накопительный эффект). Объяснение на утках тоже не работает — оно не несёт никакой интеллектуальной пользы кроме склеивания плохого материала. Нужна осмысленная конкретика. Избирательное уклонение от ответов создаёт впечатление будто программирование — это запоминание магических слов.

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

(В целом, паскаль ведь для этой задачи и создавался. Только потом его сделали монстром. А Java — язык индустрии изначально. Простым его принято называть только между нами.)

kaldeon ★☆
()
Последнее исправление: kaldeon (всего исправлений: 6)
Ответ на: комментарий от ugoday

А читал я её интуитивно.

Не, у меня был чит в виде хорошего знания C++. Но вроде его везде преподают, так что хз.

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

Я не очень понимаю в чём вообще претензия к го. В го сборщик мусор. Это по-умолчанию не самый быстрый язык и, если упираться в сборку мусора, не самый удобный. Какие-то непредвиденные кейсы будут страдать. В этом, наверное, даже C будет удобнее. Но это нишевый кейс, который не делает язык C самым лучшим на свете.

У меня пока в этом топике нет и не было претензий к Go, была претензия к конкретному утверждению, что переписав с Go на Go, но только мол ПРАВИЛЬНО, можно было бы добиться того же, что и на Rust + Tokio, разницы нет, а в условном Cloudflare сидят дураки, сервят треть интернета, а ПРАВИЛЬНО писать за 10 лет на Go так и не научились.

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

Появилась строгая типизация

Точно? Когда я смотрел последний раз, строгая типизация там работала исключительно на верхнем уровне типов, а всё, что чуть сложнее ключ-значение - всё еще было нестрогим.

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

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

Я на Java начал писать примерно через 5 минут после знакомства с ней.

А я, в своё время, на FORTH начал писать прямо в процессе знакомства с ним, без какой-либо «раскачки». ;)

У джавы он точно околонулевой.

А у FORTH — просто нулевой. :) Для меня. Был, когда я его впервые «взял в руки». :))

А вот для увидевших его у меня коллег он оказался бесконечно высоким... ;) :)) Попросту «не пошло» у них, после «въевшихся в мозги» всяких там C и, особенно, CLIPPER.

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

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

Точно?

Точно

Строгая типизация определена только для объявлений скалярных типов. Единственное исключение из этого правила — значение типа int может передаваться при объявлении типа float.

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

Строгая типизация определена только для объявлений скалярных типов.

Ну как обычно в PHP, костыли и полумеры.

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

Ну как обычно в PHP, костыли и полумеры.

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

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

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

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

Берёте молоток и ужасаетесь тому, что он раздвоен с двух сторон. Он, конечно, всё ещё пригоден, я имею ввиду, что вы можете забивать гвозди серединой бойка, держась за ручку наоборот.

Берёте плоскогубцы, у которых нет зазубрин; они плоские и гладкие. Не так полезно, как могло бы быть, но ими всё ещё можно выкручивать болты.

И так далее. Все инструменты чем-то странные и вывернутые, но не настолько, чтобы быть совсем бесполезными. И во всём наборе нет конкретной проблемы; в нём есть все инструменты.

Теперь представьте себе миллионы плотников, использующих такой вот набор инструментов и говорящих вам: «А что не так с этими инструментами? Я никогда не использовал ничего другого и они отлично работают!». И плотники показывают вам, построенные ими дома с пятиугольными комнатами и крышей кверху ногами. Вы стучитесь в дверь, она просто падает внутрь и они орут на вас за то, что вы сломали их дверь.

Вот что не так с PHP.

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

73% всех сайтов в мире с вами не согласны. PHP — один из лучших бэкендов для разработки веб-приложений. По совокупности факторов (скорость разработки, зрелость экосистемы, набор возможностей для веба) ему по-прежнему сложно найти равных.

Всё остальное — это, скорее, следствие незнания современного PHP.

Obezyan
()
Ответ на: комментарий от ugoday

PHP — игрушечный язык для маленьких неответственных проектов

Ну уж нет, вот как раз почти все веб монстропроекты на пыхе (ну или жава)

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

Вот что не так с PHP.

Увы не встречал ЯП, с которым подобных ощущений нет. Вы просто привыкли к своей сишечке/плюсам/пистону/js, и вам там все кажется прямым и логичным)

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

Нет. Косяки в одном языке не могут быть оправданиямя косякам в другом. Где-то их больше, где-то меньше. И в PHP их слишком много, это объективная реальность.

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

Косяки в одном языке не могут быть оправданиямя косякам в другом.

Ну это да. Но лично я считаю, что пых не более кривой, чем другие, к примеру пистон, что его незаслужено ху… лят больше других. А пальму первенства по кривости я бы отдал js, с большим отрывом.

goingUp ★★★★★
()

А как в го существуют указатель и автосборка мусора? Бред какой-то, где гарантия, что объект на который он указывают еще живой?

Lusine
()
Ответ на: комментарий от Neresar

Не только. Еще кубер. И еще дофига чего околокубового.

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

В любом языке программирования есть указатели. Сборка мусора и указатели никак друг другу не мешают.

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

Даже так запрещено

нет, не запрещено

https://go.dev/play/p/1sS3ZBjbG0r

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

теперь сам отвечаю на свой вопрос

Интересно, а в чем проблема

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

The operand must be addressable, that is, either a variable, pointer indirection, or slice indexing operation; or a field selector of an addressable struct operand; or an array indexing operation of an addressable array. As an exception to the addressability requirement, x may also be a (possibly parenthesized) composite literal.

FishHook
()
Ответ на: комментарий от Zhbert

Но вообще она мне реально нравится.

если бы из нее повыкидывать говнишка навроде effectively final переменных, боксинг-анбоксинг и всякие давно не используемые штуки вроде wait/notify получился бы неплохой язык. А, погоди, котлин и получился бы.

FishHook
()
Ответ на: комментарий от vbr

Как сборщик мусора сообщает мне, какие указатели уже висят? Если верить книжке: «Указатели представляют собой объекты, значением которых служат адреса других объектов (например, переменных). Так, когда мы объявляем переменную, компилятор Go выделяет некоторое пространство в системной памяти в соответствии с типом этой переменной. Это пространство памяти имеет уникальный адрес для идентификации этой переменной. Адрес представлен шестнадцатеричным значением. И указатель может хранить адрес этой переменной. И, таким образом, через указатель мы можем обращаться к адресу переменной.» Это тупо адрес памяти, как и в гаденьком С. char* ch;

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

Я в психологии не силён, но тут только пожать плечами, пожалеть и отойти из зоны поражения. Они с php нашли друг друга.

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

Как сборщик мусора сообщает мне, какие указатели уже висят?

Зачем? Очевидно, это не только «тупо адрес» что даже в сишочке давно не так, и в рантайме при удалении/создании экземпляра указателя таскаются проверяются дополнительные счётчики или флаги.

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

Ну, нет. Одно дело, когда на этапе дизайна принято определённое решение, которое где-то подходит, где-то нет и грех жаловаться, что java требует java-машину, а в clojure неудобно работать с изменяемыми данными. Большинство ЯП относятся к этому случаю. И совсем другое, как в php и C++, когда вообще не было никакого разумного дизайна, а фичи прото лепили по случаю как придётся.

P.S. Шах и мат, атеисты, кстати.

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

Какие счетчики и флаги, кто их ставит и где, когда это тупо адрес, как написано в книжке? В сишечке такие же тупые указатели, иначе нахрена было в плюсах заморачиваться на share и weak ptr?.

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