LINUX.ORG.RU

Чем плох Go?

 , ,


5

14

Отчего многие его так не любят, что с ним не так? Ну кроме того, что:

  1. Нет дженериков, укуренные решения вроде sync.Map interface{} в stdlib как следствие;
  2. Базилион способов объявить переменную;
  3. Магические функции new() и make(), которые работают только с некоторыми типами;
  4. Выбивающиеся из общего стиля ЯП iota вместо enum, <- и ->;
  5. Сильно ограниченные константы, пригодные только для базовых типов данных;
  6. Кастрированные кортежи;
  7. Бесполезность поддержки unicode в коде ввиду того, что экспортированы могут быть только элементы, начинающиеся на символ из ограниченного подмножества;
  8. Unicode code point'ы можно складывать как числа;
  9. Впиндюренные в сам ЯП, а не в библиотеку «горутины»;
  10. Невозможность форка проекта с сабпакетами (он не скомпилируется с помощью go get/go install, официальная рекоммендация - использовать sed);
  11. Сообщество, которое в каждом объективном дефекте видит глубокий смысл и большой плюс;
  12. Go 2, который не пофиксит ничего из этого, кроме дженериков.

Вроде, не критично всё это, жить можно же?

Ответ на: комментарий от deadNightTiger

А если пожать их UPX-ом?

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

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

Покажите аналог растовских option и result.

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

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

Покажите аналог растовских option и result.

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

До введения оператора "?" Option и Result иожно было использовать как в Go (с постоянными return) или с try!, а с "?" даже return писать не надо. Так что это в Go неудобно сделано.

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

Вот, в качестве иллюстрации на примере Го-подобного языка с дженериками и алгебраическими типами, как могло бы быть:

type Result[Type, Error] oneof {
    Error ErrorType // появляется тип type Result.Error ErrorType и синоним для него - error
    default Type
}

// Частный случай !Type = Result[Type, string]. Для этого типа можно ввести компиляторный интринсик, чтобы default работал как положительное условие в if-е, а error как отрицательное

// функция пытается открыть файл с данным именем. Если получается возвращает файл. Если не получается прибавляет к имени расширение '.txt' и пытается ещё раз. Возвращает файл либо ошибку
func AltOpen(name string) !*os.File {
    file1 := os.Open(name) // Open = func(string) !*os.File
    if file1 { 
        return file1
    }
    // получается, что file1 = error[string]
    file2 := os.Open(name + ".txt")
    if file2 {
        return file2
    }

    return error(fmt.Erorrf("cannot open %s(.txt): %s (%s) and %s(%s.txt)", name, string(file1), name, string(file2)))
}
Joe_Bishop ()
Ответ на: комментарий от tailgunner

проблема с ? в том, что он слишком жёстко фиксирован и всегда возвращает ровно то, что получил. А если тип в Err отличается? Короче, довольно адекватный, но костыль.

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

Короче, довольно адекватный, но костыль.

Я не согласен, но не суть... даже без ? ситуация лучше, чем в Go (за счет AlgDT).

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

Какая-то лапша.

это явный код с явными правилами. С полным контролем над ситуацией. Уж точно лучше чем позорный растовый костыль, который к тому же возвратит кишковый Error. А захочется какого-то объяснения – опять ёлочка.

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

Шта? '?' придумали не в расте, ваш КО. Как минимум в swift и kotlit он тоже есть.

С полным контролем над ситуацией.

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

возвратит кишковый Error.

Шта?

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

ситуация лучше, чем в Go (за счет AlgDT).

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

это где-то 95% всех случаев. Вот хотя у меня в последние два месяца было 5 разных парсеров и да, начал подвывать из-за отсутствия ADT и постоянных NPD-ешек, прямо питон, тьфу. Но это, повторяю, нетипичный случай.

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

ситуация лучше, чем в Go (за счет AlgDT).

в большинстве задач для которых используется Go не лучше: для него есть куча линтеров

Я сказал, что Rust в этом плане лучше, чем Go - ты сказал, что Rust почти всегда не лучше Go с линтерами. Ну окей, чо.

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

В rust тоже полный контроль, ибо компилятор всё проверит.

потерян контроль над flow

Шта?

возвращает std::io::ErrorKind и точка

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

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

потерян контроль над flow

проблемы go-детей

возвращает std::io::ErrorKind и точка

И? Кто мешает его преобразовать? Опишите задачу полностью.

нужно текстовое сообщение на англ.

Быдлокодеры в треде.

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

Я сказал, что Rust в этом плане лучше, чем Go - ты сказал, что Rust почти всегда не лучше Go с линтерами. Ну окей, чо.

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

А раст – пример плохого дизайна. Сколько лет они внедряли этот костыль с ? То, что такая нужная вещь появилась не сразу говорит о том, что они хуйнёй маялись, ну и на выходе довольно маргинальное изделие.

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

Я сказал, что Rust в этом плане лучше, чем Go - ты сказал, что Rust почти всегда не лучше Go с линтерами. Ну окей, чо.

инструменты решают

Когда языку нужны внешние инструменты для решения базовых задач - это г^Wпример плохого дизайна. А линты и в Rust есть.

Сколько лет они внедряли этот костыль с ?

Повторю - он был выше уровня Go даже без этого «костыля».

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

проблемы go-детей

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

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

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

Ору! То-то я вижу засилье go софта. Ах стоп, на нём же не пишут ничего кроме бекендов.

В общем диагностирую фанатизм в терминальной стадии.

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

кубернетес, мерзкий докер, прометеус, NATS (и NATS streaming), etcd, consul и куча тулзеней поменьше довольно неплохо решающих прикладные задачи.

чота ты упоролся, дружок :)

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

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

то вовсе не факт, что вместо традиционных плюсов стоит брать Rust.

Хорошо, что мозила считает иначе.

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

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

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

suuaq ()

Лично для меня он плох наличием GC. Всё-таки это системный язык, не должно в нём быть этой магии с памятью. А ещё странный, упоротый синтаксис. Но это всё дело вкуса.

Как инструмент, для чего-то он должен быть пригоден.

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

Ты определенно путаешь наследование и композицию. Наследования в go нет.

Какая буква в слове «эмуляция» тебе не понятна?

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

Всё-таки это системный язык

Нет, это апгрейд для питономакак.

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

Какая буква в слове «эмуляция» тебе не понятна?

Научись внятно свои мысли формулировать, раз имеешь ввиду не то, что пишешь. Конкретно тут 4.2:

Наследование имеется,

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

Сразу после того, как ты разовъёшь свои навыки чтения:

можно даже множественное эмулировать

Но это не принципиально и к сути тезиса «В Go есть ООП, но 'не такое как у всех' (один фейспалм с internal/ чего стоит)» никакого отношения не имеет.

SwiftRocks ()

Жить можно. Язык убогий, конечно. С другой стороны нет комплексов от х;як-х;як и в продакшен (где, о чудо, все работает почти сразу).

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

Извини, libastral протух. Без него очень трудно читать дислектика. То, что ты можешь печатать, и даже, вероятно, ходить ногами не значит, что ты ногами печатаешь. Хотя с тобой это и не исключено. Но вот утверждение, что доступ в интернет у тебя имеется вполне однозначно.

feofan ★★★★★ ()

Две кастрированные системы обработки ошибок - тип error и panic с recover

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

Проблема в том, что в Go все пакеты (включая стандартную библиотеку) компонуются статически. В С же большинство библиотек компонуются динамически, за счёт чего уменьшается размер основного бинарника. Ну и не требуется копировать библиотеки для каждого бинарника.

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

И именно поэтому она на помойке, в ней за 10лет впили только ксс-парсер на расте, за 10лет нет ни раста, а серво не умеет в ксс( от слова совсем). Серво ровным счётом НЕ МОЖЕТ НИЧЕГО нарисовать, либо вообще( в 95% случаев), либо без артефактов.

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

Вот так и получается, что 10лет есть, раста нет, 20раз уже со всем обосрались( раньше ГЦ был быстрым - обосрались. Теперь уже ГЦ плохой. Раньше свой супер-синтаксис был лучшим - обосрались - напастили из крестов. Раньше орали о том, что «ошибки надо проверять, иммутабельность, ко-ко-ко», а потом бам - обосрались и unwrap через unwrap через mut.), лисы нет, серво нет. Ни одной живой софтины на расте нет - только лабы.

Вот так оно и выходит.

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

Использую Firefox 58 каждый день. Артефактов нет. Скроллить по 5 минут не надо.

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

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

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

Использую Firefox 58 каждый день.

Любая секретарша использует осла каждый день, и? Да и в этом осле ничего нет на расте, кроме хелворда в 0.5% броузера. Поэтому пока мимо.

Артефактов нет.

Есть, да и я говорил про серво - научись читать.

Скроллить по 5 минут не надо.

В параллельной вселенной. Открываем about:preferences#general и видим скролл на 10экранов. Это на вас так это поделие влияет, что вы уже неспособные воспринимать реальность?

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

Есть, да и я говорил про серво - научись читать

Серво ровным счётом НЕ МОЖЕТ НИЧЕГО нарисовать, либо вообще( в 95% случаев), либо без артефактов.

Никаких артефактов я не замечал. И это при том, что я использую Developer Edition (aka Aurora).

В параллельной вселенной. Открываем about:preferences#general и видим скролл на 10экранов. Это на вас так это поделие влияет, что вы уже неспособные воспринимать реальность?

10 экранов, говоришь?

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

Вот когда Rust подменит LLVM/Clang в Xorg, вот тогда заживём.

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

Никаких артефактов я не замечал.

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

Вот ты мне объясни, нахрена я с тобою вообще говорю? Я говорил о серво, потом ещё раз тебе сообщил о том, что говорил о серво. Ты не знаешь что такое серво? Ты альтернативно-одарённый?

И это при том, что я использую Developer Edition (aka Aurora).

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

А по поводу артефактов - оно всё в них, этим дерьмом пользоваться попросту невозможно - я иногда врубаю его, чтобы держать в нём лор, но даже от одной-двух вкладок - это убожество уже через пол дня начинает жрать 3гига и одно ядро( больше оно попросту не может). И это началось именно тогда, когда начали впихивать в него раст( которого там 0.5%, а когда будет 100%(этого никогда не будет, но предположим) - ой чую я то, насколько ахтунг это будет( судя по серво и уровню вменяемости адептов)).

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

10 экранов, говоришь?

Да, говорю. Ты решил играть в идиота?

vcerloman ()

Что-то тут в комментариях Go всё с Rust'ом да с Rust'ом сравнивают. Интереснее было бы почитать сравнение с Nim.

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

А для меня это самый большой плюс :)

Можно аргументировать, почему? Упрощается деплой? А если внутри Go-рантайма найдут уязвимость? В случае с динамической линковкой ведь тебе потребуется просто обновить пакет и перезагрузиться, а в случае со статикой — пересобирать твой проект.

Пара мегабайт на полностью автономную переносимую программу с приличным быстродействием, ИМХО, сегодня совсем не много.

Когда такая программа одна.

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

То-то в генту при каждом втором обновлении системных либ нужно кучу пакетов пересобирать. Особенно из-за ICU.

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

Пролез или не пролез, Rust — язык другого калибра; без сборщика мусора и более ручным контролем вещей. А Go и Nim видятся более похожими, по крайней мере, оба в той или иной степени вдохновлены Python'ом, и оба имеют сборщик разруливающий циклы.

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

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

Virtuos86 ★★★★★ ()

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

lovesan ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей