LINUX.ORG.RU

Что происходит с популярностью Go?

 ,


1

3

Примерно с лета прошлого года популярность языка программирования Go неуклонно падает. По крайней мере если верить индексам TIOBE и PYPL. В начале прошлого года Go входил в первую десятку самых популярных языков программирования, но сейчас он уже во второй десятке - ближе к её нижней границе. Если TIOBE и PYPL не отражают действительность, то какие другие индексы отражают её лучше? Хотя на https://langpop.com/ Go всё ещё в первой десятке. Что вообще происходит с Go и каковы ваши прогнозы на ближайшие пару лет?

Ну и чтобы два раза не вставать, дополнительный вопрос. Один из конкурентов Go - это JavaScript/TypeScript на платформе node.js. Когда популярность Go росла, значительный процент новых программистов на Go был представлен теми, кто переходил на него с JS/TS. Однако если сейчас посмотреть на объявления о работе (живу не в России), то там какое-то засилие именно JS/TS, причём в основном это молодые компании и стартапы. Можно ли это объяснить банальной экономией на найме, когда одни и те же люди делают и бэкэнд и фронтэнд? Иначе я никак не могу понять тягу к языку, в котором нет нормальной параллельности и вообще куча костылей и легаси.

Update: большой брат подслушал и порекомендовал в ютубе: www.youtube.com/shorts/Vh97uPhmhqI



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

var быстрее let

везде пихают именно let.

if (true) {
    var x = 'Hello word'
}
console.log(x)
var x = 'test'
console.log(x)

И тому подобные приколы с var. Надо десять раз подумать перед использованием var.

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

Мне удобно, когда wtf как можно меньше.

Так что в питоне такое не появится

В отличии от сумасшедших С++ников (не они одни такие, но среди них такая шиза наиболее процветает), я не считаю, что на свете должен остаться один, самый-самый язык. Есть место для языков, позволяющих сделать красиво. А есть для скучного программирования скучных рабочих задач. В том числе и для питона.

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

Аргумент в стила «а у вас негров линчуют». Мы же сейчас не об этом.

Это в очередной раз о том, что вы не можете в предметную дискуссии – ни пруфов, ни кода, ни вменяемых объяснений.

Вопрос заключался в том, как инжектить любую реализацию этих интерфейсов в одном классе, а не только LinkedList

Куда инжектить, зачем инжектить? Вы примером кода разродиться можете?

Ваш код на Go у меня пока никак не соотносится с вашими словами про Java. А на прямые вопросы вы не отвечаете.

Это к вашему недоумению о том, почему кому-то не хватает ваших словесных «описаний» и зачем просят код.

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

Куда инжектить, зачем инжектить? Вы примером кода разродиться можете?

Ну дурак! Прямо как в Собачьем сердце: https://www.youtube.com/watch?v=n4SFu2qSGn8

Вы не работали со Spring, не знаете что такое dependency injection, не знаете куда чего инжектят и зачем вообще этот самый dependency injection существует. При этом вы всё равно лезете в спор на эту тему, не просто ничего не понимая, а ещё и будучи совершенно уверенным в своей правоте. Как вас ещё не уволили с таким уровнем необучаемости?

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

Ваш код на Go у меня пока никак не соотносится с вашими словами про Java.

Ну дурак же! В двух соснах… интерфейсах запутался. Простой пример из Java с простым примером из Go соотнести не в состоянии. Ничего не знает, ничего не понимает, но постоянно требует код, как Шариков водки.

hummer
() автор топика

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

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

Как вас ещё не уволили с таким уровнем необучаемости?

Может быть потому, что я не программирую на Java, не использую Spring, не связываю dependency injection исключительно с Java+Spring?

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

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

Простой пример из Java с простым примером из Go соотнести не в состоянии

А может ли это быть из-за того, что «простого примера из Java» не было?

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

Может быть потому, что я не программирую на Java, не использую Spring, не связываю dependency injection исключительно с Java+Spring?

А как же Rust? Ведь в нём, в отличии от Java, это как раз можно. Что же вы Rust не вспомнили?

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

Spring - это всего лишь пример фреймворка, в котором dependency injection активно используется. А сам dependency injection с утиной типизацией в Go или с fn foo(x: impl A + B) в Rust становится более гибким.

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

А может ли это быть из-за того, что «простого примера из Java» не было?

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

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

Вот, вы тут спорите-спорите, а серьёзные вопросы остаются без ответа: ЧТО СЛУЧИЛОСЬ СО SCALA??!!!!

Один мой бывший коллега (вмести кодили на Java) сначала ушёл в Salesforce, где поначалу был очень рад условиями. Но года через два ушёл в какой-то стартап на любимую Скалу, сказав, что в Salesforce на Java и с тамошней организацией работы он лишь терял квалификацию. Когда мы работали вмести он писал на Java в Scala стиле. Например избегал бросать исключения и вместо этого возвращал их в Tuple.

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

Go впринципе не должен был стать таким хайповым, каким он стал.

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

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

Впрочем, влияние гугла отрицать нет смысла. Видимо, все учили, чтобы оффер получить.

Офер в Гугле? Наврядли в этом дело. Скорее влияние гугла больше проявлялось через их вес и их продукты, написанные на Go. Взять хотя бы K8s.

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

Что же вы Rust не вспомнили?

Зачем? Вы же сравнивали Go и Java. Типа в Java чего-то невозможно. Непонятно только что.

А сам dependency injection с утиной типизацией в Go или с fn foo(x: impl A + B) в Rust становится более гибким.

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

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

Ну вот по крайней мере один читатель ваших бредней не понял что именно у вас вызывает проблемы с Java. Предположил, что если вы продемонстрируете примеры кода, то ваш спор с ya-betmen может стать более предметным.

Но примеры кода с вашей стороны так и не появились.

Что ожидаемо, т.к. вы вновь и вновь доказываете, что в предметную дискуссию не можете.

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

Зачем? Вы же сравнивали Go и Java. Типа в Java чего-то невозможно.

Ну а зачем вы в этой теме вообще Rust противопоставляли Go?

Непонятно только что.

Когда мозгов не хватает, действительно непонятно.

А сам dependency injection с утиной типизацией в Go или с fn foo(x: impl A + B) в Rust становится более гибким.

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

Я и сейчас это говорю и с пруфами у меня всё в порядке.

Ну вот по крайней мере один читатель ваших бредней не понял что именно у вас вызывает проблемы с Java. Предположил, что если вы продемонстрируете примеры кода, то ваш спор с ya-betmen может стать более предметным.

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

Но примеры кода с вашей стороны так и не появились.

Появились. Хватит тупить.

Что ожидаемо, т.к. вы вновь и вновь доказываете, что в предметную дискуссию не можете.

В предметную дискуссию с идиотами действительно не могу. Я не психиатр.

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

А кому он, простите, нужен? Что с ним, простите, делать? Вот есть у тебя скалистое приложение в проде, а через несколько лет секурити типа приходит и грит, мол скала старая-дырявая обновляйте. Ты хочешь на следующий релиз без дыр, а он там совместимость сломали и половина либ уже не работают с ним, тых хочешь на новые версии либ переехать, а авторы уже на следующую версию жабы пругнули. Едешь нановую скалу с новой жабой а у тебя отлетают проприетарные либы. Хочешь обновитьтх, а они только в составе новой версии соыта, которую нужно покупать за новые деньги.

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

ya-betmen ★★★★★
()
Ответ на: комментарий от hummer

Ну а зачем вы в этой теме вообще Rust противопоставляли Go?

Для человека, который других называет идиотами, у вас слишком короткая память и неспособность следить за разговором. Но здесь же все ходы записаны, поэтому несложно и напомнить: Что происходит с популярностью Go? (комментарий)

Я и сейчас это говорю и с пруфами у меня всё в порядке.

Ну и где ваши пруфы? Ссылку, плз.

В моем примере вообще можно обращаться к ForeignClass через интерфейс, который этим классом даже не реализуется.

Появились.

Пожалуйста дайте ссылку на свой комментарий где есть пример кода на Java.

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

ИМХО, slices.Sort показывает как оно должно быть. Тогда как sort.Sort без дженериков выглядит как крутой workaround

Workaround, конечно, крутой. Я с помощью sort.Interface смог написать сортировку матрицы по-диагонали, in-place. Абстракция, которая открыла метод, немыслимый напрямую.

Но я думаю, что причина, по которой slices.Sort кажется более правильным, заключается в привычке решать проблемы через иерархии типов. Если бы мы решали проблему в чистом ОО-стиле, то у нас бы должен был быть некий интерфейс SortStrategy, определяющий единственный метод sort, который бы потомки реализовывали как qsort/merge-sort/итд.

И в данном случае без дженериков родительский тип не имел бы гарантий насчёт дочерних типов:

void sort(List<T> list, Comparator<? super T> comparator);

Скажем, если бы мы написали Comparator для Dog, то без дженериков мы бы не смогли его передать в AnimalSortStrategy, по сути делая язык непригодным для полиморфизма.

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

И получить огромный расход памяти и просадку про производительности в случаях, когда хранить нужно int-ы или double-ы.

Машина не устанет :)

С тех пор раз в 3-4 месяца в это дерево добавляются какие-то новые фичи.

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

Если разработчик ноет про то, что работа с контейнерами недостаточно чисто написана, то что дальше? Ну вот проблема с контейнерами решена в Go, теперь будем ныть, что нельзя fmt.Println(«answer:», strconv.Atoi(«41»))? Не будет ли более зрелым принять тот факт, что идеальная чистота не всегда необходима?

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

Тип поля за именем стоит, но без разделителя.

Разделители | далеко | не | всегда | нужны.

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

А так учитывая что тот же Роберт Гриземер прямо вместе с Виртом работал вполе очевидно откуда он и вытащил многие концепты

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

А вот Роб Пайк как раз больше всех остальных хвалил интерфейсы. “I feel that interfaces are one of the best-designed things in Go.” [1]

И если этого мало, то: “the result [of interface composition mindset] is an adaptability of design that is harder to achieve through type hierarchies.” [2] И здесь же, рядом с цитируемым отрывком, пример из Plan 9.

[1]: https://commandcenter.blogspot.com/2024/01/what-we-got-right-what-we-got-wron...

[2]: https://go.dev/talks/2012/splash.article

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

Go это язык для идиотов же официально? А их нейросети заменили и он стал не нужен

Нейросети действительно заменяют идиотов: они очень даже способны запрашивать непоколебимое решение на фоне полной неосведомлённости и поиска авторитета там, где его нет. Иронично, что ваше первое предложение именно таким и является.

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

А вот факт того, что Go-шники много лет жрали sort.Ints, sort.Strings и пр., . . . очень показателен.

С точки зрения клиентского кода, между slices.Sort(numbers) и sort.Ints(numbers) разницы почти никакой. Здесь нет ничего показательного.

Если же речь идёт о слайсах произвольного типа, то использовали, как правило, sort.Slice, который на поверхности не многим отличается от slices.SortFunc, а в деталях даже мощнее будет, ибо позволяет сортировать в том числе по позиции и по данным из сторонних источников.

Что-то показательнее ещё осталось?

да еще и говорили «не надо нам усложнять язык дженериками»

Далеко не все.

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

Но ведь нотации типов в Си и Го диаметрально противоположные. В Си — спиральная (принцип соответствия использованию), в Го — постфиксная. Причём Кен Томпсон сам сказал, что решение сделать нотацию такой было принято за 10 секунд [1] (26:30).

[1]: https://youtu.be/sln-gJaURzk

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

Почему вы не можете в Java сделать обертку над чужим классом

Подозреваю, что ответа на данный вопрос до сих не было. Поэтому попробую ответить я: обёртку сделать можно и нужно. Однако, Go позволяет этого не делать. Достаточно объявить интерфейс на своей стороне и всё, пауза на бухгалтерию окончена.

Это приятное, но не основное предназначение неявной реализации. Основное — сделать композицию лёгким и повсеместным инструментом.

А разделение реализации и интерфейса правильнее объяснить так: реализация не зависит от абстракции и не даёт заранее предопределенных контрактов (implements this, implements that), что позволяет реализации проще их менять (изменения затрагивают только непосредственных пользователей отделённых интерфейсов).

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

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

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

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

Если бы мы решали проблему в чистом ОО-стиле

Мне, как C++нику, непонятно зачем решать проблему в чистом ОО-стиле, если ее можно эффективнее решить другим способом.

Машина не устанет

Машина тупо не потянет.

Если разработчик ноет про то, что работа с контейнерами недостаточно чисто написана, то что дальше?

Использовать более мощный и выразительный язык?

теперь будем ныть, что нельзя fmt.Println(«answer:», strconv.Atoi(«41»))?

А ведь на этом примере можно хорошенько пофантазировать о том, что бы было, если бы Go изначально был более выразительным и менее догматичным (в частности по отношению к паникам/исключениям).

Например, были бы в языке дженерики и sum-types, был бы сразу условный Result[T, Err], можно было бы добавить в fmt.Println поддержку вывода для Result. И записывалось бы это так:

fmt.Println("answer:", strconv.FromString[int]("41"));

Или же:

fmt.Println("answer:", strconv.FromString[int]("41").or_else(-1));

Или же:

fmt.Println("answer:", strconv.FromString[int]("41").unwrap());

если нас устраивает выброс паники.

Или, допустим, до sum types не додумались, но относились бы более лояльно к исключениям/паникам:

fmt.Println("answer:", strconv.FromString[int]("41"));

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

Идеальная чистота и недостижима. Но в 2010-х годах отряхивать от нафталина наработки из Alef (конец 1980-х) и Limbo (середина 1990-х) игнорируюя при этом все, что происходило вокруг, чтобы получилось вот это:

v, err := strconv.Atoi("41");
if err != nil {
  v = -1
}
fmt.Println("answer:", v);

ну такое себе. Не следует после этого удивляться репутации «языка для дебилов».

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

ну такое себе. Не следует после этого удивляться репутации «языка для дебилов».

Вопрос к вам.

Зачем синтаксис C++ так усложнили?
На Си написано много популярных проектов.
Это подтверждает то, что для разработки алгоритмов Си вполне подходит.
И синтаксис прост.

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

Довольно быстрый и сравнительно простой язык.

Ну Гугл сейчас активно занимается исправлением этого досадного недоразумения, и превращает классный виртовский язык в С++, а то конкурируем с плюсами и растом, а язык почему-то понятный для людей - непорядок, нужно исправлять.

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

Ну Гугл сейчас активно занимается исправлением этого досадного недоразумения, и превращает классный виртовский язык в С++, а то конкурируем с плюсами и растом, а язык почему-то понятный для людей - непорядок, нужно исправлять.

«Где просто, там ангелов со ста. Где мудрено - там ни одного».

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

Не следует после этого удивляться репутации «языка для дебилов».

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

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

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

Универсальный и удобный во всём ЯП невозможно разработать с использованием контесных грамматик.

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

Я лично изучил чисто из уважения к Роб Пайку, потому что План9 хороший. Потом не использовал пока не пришли БЯМ.

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

Универсальный и удобный во всём ЯП невозможно разработать.

Не нужно разрабатывать универсальный язык, нужно разрабатывать язык который делает хорошо в конкретной доменной области.

sbu_shpigun ★★
()
Ответ на: комментарий от ya-betmen

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

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

Мне, как C++нику, непонятно зачем решать проблему в чистом ОО-стиле, если ее можно эффективнее решить другим способом.

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

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

В Го напрямую это выглядело бы так:

Sort(any, func(any, any) int)

И здесь сразу видно, что any — это проблема не только конкретно здесь (что решается тривиально рефлексией), но и потенциальная проблема, если бы иерархия типов была возможна.

Машина тупо не потянет.

Неуместный пессимизм.

А ведь на этом примере можно хорошенько пофантазировать

К какому выводу вы пришли, кроме «красиво» и «все остальные так делают»? Довольно поверхностно.

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

strconv.Atoi — это ведь не мелочь какая-то. Усложни его API на уровне языка — усложнится весь язык. Поэтому я лично очень доволен проверять ошибку Atoi каждый раз.

отряхивать от нафталина наработки из Alef (конец 1980-х) и Limbo (середина 1990-х)

А кто-нибудь кроме Go смог должным образом усвоить уроки Alef и Limbo?

Пока опыт из прошлого не был осмыслен, он остаётся релевантным в каждом новом поколении.

Не следует после этого удивляться репутации «языка для дебилов».

«Объяснение явлений через глупость людей — это характерная черта снобов, выдающая их собственный узкий взгляд на мир.»

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

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

sbu_shpigun ★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария