LINUX.ORG.RU

Go на пальцах

 


0

4

Объясните ньюфагу что в Go такого крутого, что в последнее время вокруг него такой ажиотаж (я помню когда он только вышел его все обсирали и пророчили ему судьбу языка D)?

Объясните ньюфагу что в Go такого крутого, что в последнее время вокруг него такой ажиотаж

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

Правда, лично для меня есть серьёзный минус — отсутствие исключений. Возврат кода ошибки — это совсем не то.

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

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

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

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

Увы, нисколько :-/ Во-первых, синтаксис не очень удобный, мусор получается. Во-вторых, приходится ставить проверку на каждом уровне возврата. Количество паразитного кода возрастает многократно. Вместо того, чтобы сделать один try на высоком уровне и ловить исключение, где бы оно не вылетело, приходится добавлять десятки, даже сотни if'ов...

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

«Не напрягался» — это тупо игнорируют ошибки? Или то, что при просмотре сорцов не видно отсутствия напряжения от проверок на каждый чих? :)

...

Кстати, это и потенциально для надёжности чревато. Ставить проверки на каждый чих будет лениво и в ряде случаев проверки на ошибки будут опускать...

KRoN73 ★★★★★
()

Ничего, честно говоря. И это круто.

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

Это опускание зато сразу видно. Наверное, можно даже хук на гит поставить.

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

Кстати, это и потенциально для надёжности чревато. Ставить проверки на каждый чих будет лениво и в ряде случаев проверки на ошибки будут опускать...

С эксепшонами точно такая же фигня

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

С эксепшонами точно такая же фигня

Нет. Там достаточно ловить «наверху», игнорируя всю низовую цепочку. На порядки меньше писанины.

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

Забанят, не бойся, всему свое время.

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

Количество паразитного кода возрастает многократно.

Ты ещё просто не пропитался духом Гожьим. Это вовсе не паразитный код. Это вполне реальные возможные состояния твоей программы. Или ты собрался тупо сказать юзеру: «То, что ты хотел, сделать не удалось, почему — ХЗ, сам разбирайся»?

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

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

руки отрубишь сам себе, при отладке

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

Кстати, это и потенциально для надёжности чревато. Ставить проверки на каждый чих будет лениво и в ряде случаев проверки на ошибки будут опускать...

Для этого есть errcheck.

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

Каким боком? Кто-то запретит мне увидеть трейс?

1. а с чего это ты его увидишь, если ты наверху все ловишь? Если ловишь - то как-то обрабатываешь, правильно?

2. с каких пор трейс показывает что-то кроме цепочки вызовов?

3. исключения должны быть отдельно, ошибки - отдельно.

касательно go - тебе надо проверять результат обращения к чужим функциям, паниковать если чего (это если ленишься вверх передавать код ошибки), и наверху панику ловить.

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

Нет. Там достаточно ловить «наверху», игнорируя всю низовую цепочку. На порядки меньше писанины.

Тем не менее, там тоже >ставить проверки на каждый чих будет лениво и в ряде случаев проверки на ошибки будут опускать...: либо будет лень декларировать везде возвращаемые эксепшоны (java), либо это будет слишком неявным, стремным и неочевидным (python)

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

Тема холиворная.

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

    if len(parts) == 0 {
        return nil, nil, ErrNoComponents
    }

    h, err := mh.FromB58String(parts[0])
    if err != nil {
        log.Debug("given path element is not a base58 string.\n")
        return nil, nil, err
    }

Поменял число аргументов функции — добро пожаловать на переписывание всех возвратов... Это «эргономика программирования» уровня 1980-х годов.

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

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

Роб Пайк далеко, но мужик-то он нашенский. Я его видел, когда в Google работал, даже разговаривал с ним. В кепке, ростом невелик, с лукавым прищуром. Он такой... Даже и не расскажешь. Он прост, как правда.

Таков и Go.

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

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

Чтобы знать, что случилось, и что теперь делать, надо пробросить некислую часть стейта в исключении, а это сводит на нет преимущества (просто переносит часть кода обработки вовнутрь) и усложняет или запрещает рестарты. Исключения плохи тем, что их нельзя остановить и обработать в момент бросания, а также тем, что в генерик-кетче вообще нельзя уверенно что-то сделать, кроме лог/аборта, т.к. не все ресурсы являются самооткатными как память и лок-файлы. Любой успешный рид-врайт или запись в шаред-буфер/очередь перед исключением и вот мы в заднице.

Более лучшим подходом имхо является делегация избранных ошибок в *конкретных* местах, а по остальным нужно просто падать. Пойманный из сложного фреймворка голый EFileAccessDenied вообще ни о чем не говорит, а создавать класс на каждый чих — читай первый абзац.

В идеале нужно пробрасывать вверх continuation и cancellation хандлеры с описанием проблемы (ну или вниз в функциональном стиле), но помощи от языка или ide, чтобы было меньше писанины и асинхронки я нигде не видел.

Кстати cocoa юзает именно такой подход — его стандартный NSError выкидывается вверх с опциональным рекавери-функтором (то есть контекст при желании не разрушается), а исключения кидаются только на программные ошибки вроде выхода за пределы или вызов неверного селектора. Обрабатывать их можно только с целью скорейшего выхода.

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

Поменял число аргументов функции — добро пожаловать на переписывание всех возвратов…

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

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

Есть такая либа: https://github.com/juju/errgo/. При её использовании, соответственно делать так например:

return errors.Mask(err)
вместо традиционного
return err

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

Это «эргономика программирования» уровня 1980-х годов.

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

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

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

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

CL-USER> (get-decoded-time)
19
28
10
16
7
2015
3
NIL
-7
CL-USER> (multiple-value-bind (ss mm hh)
             (get-decoded-time)
           (format t "~2,'0D:~2,'0D:~2,'0D" hh mm ss))
10:30:18
NIL
Oxdeadbeef ★★★
()

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

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

Лучше уж аргументы посчитать...

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

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

эээ «не надо писать фортран-style в непредназначеном месте»

можно предположить что создатели языка :

отказались от подхода: «брось ошибку вызвавшему из далёка» а считают что ошибка должна быть обработана(преобразована) непосредственным вызывающим либо(как вариант таковой обработки) им же подавлена .

тогда не будет гирляндирования условий по мере удаления от источника ошибки.

qulinxao ★★☆
()

Объясните ньюфагу что в Go такого крутого

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

ovk48 ★★★
()

Скажу за себя. Мне понравилось (когда я его первый раз пощупал в версии 0.7 вроде) то, что из коробки была поддержка vim-а с автодополнением, отличные отладчик и профилировщик, очень простая и понятная возможность подключать библиотеки С. А еще то, что не нужно писать мейкфайлы, и что разделение платформозависимого кода делается через имена файлов. Это в первую очередь.

А уже во-вторую - go routines и каналы, интерфейсы и прочие мелочи.

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

Puzan ★★★★★
()

Компилируемость, сильная типизация, лаконичный и гибкий синтаксис, библиотеки для многих нужд «из коробки» (в частности для Веб).

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

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

Категорически не согласен, какая разница плодить if или try/catch? второй даже более монструозное, а первое сильно дешевле

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

первое сильно дешевле

Я бы так категорично не заявлял.

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

Разница в том, что try catch позволяет обрабатывать ошибки там, где это нужно делать. И не позволяет неявно «замолчать» или тупо пропустить ошибки дальше. Это можно сделать, но только явно в коде.

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

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

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

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

Go уже умеет все то же что Erlang/OTP?

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

2. с каких пор трейс показывает что-то кроме цепочки вызовов?

У исключений обычно есть тип и может содержаться дополнительная информация.

DarkEld3r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.