Источник картинки


Go — относительно молодой, но популярный язык программирования. По данным опроса Stack Overflow, именно Golang получил третье место в рейтинге языков программирования, которые хотели бы освоить разработчики. В этой статье мы попробуем разобраться в причинах популярности Go, а также посмотрим, где этот язык используется и почему его вообще стоит изучать.


Немного истории


Язык программирования Go был создан компанией Google. Собственно, его полное название Golang — производное от «Google language». Несмотря на то, что в анонсе язык был назван молодым, в этом году ему исполняется уже десять лет.


Цель, которая стояла перед создателями Go — разработать простой и эффективный язык программирования, который мог бы использоваться для создания качественного программного обеспечения. Роб Пайк, один из создателей Go, заявил, что Go разрабатывался для программистов компании, которые относительно недавно закончили учиться и знают Java, C, C++ или Python. Go для них — язык, в котором можно быстро разобраться и к которому быстро привыкаешь.


Изначально он был инструментом внутри Google, но с течением времени вышел из недр корпорации и стал достоянием общественности.


Преимущества языка


У Golang есть большое количество плюсов, как известных, так и не очень.


Простота. Собственно, это была основная цель создания языка, и ее удалось достичь. У Go достаточно простой синтаксис (с определенными допущениями), поэтому приложения можно разрабатывать быстрее, чем на некоторых других языках. И здесь есть два интересных момента.


Во-первых, Golang достаточно быстро может изучить полный новичок в программировании — тот, кто не знает вообще ни одного языка и только собирается стать разработчиком. О Go можно сказать, что он почти такой же несложный (относительно, конечно), как PHP или даже Pascal, но такой же мощный, как С++.


Во-вторых, Go может освоить уже «сформировавшийся программист», тот, кто уже знает один или несколько языков. Чаще всего разработчики изучают Go после того, как освоили Python или PHP. Далее некоторые программисты с успехом используют пару Python/Go или PHP/Go.


Большое количество библиотек. Если вам не хватает какой-либо возможности в Go, можно воспользоваться одной из множества библиотек и выполнить требуемую задачу. У Go есть еще одно преимущество — можно без проблем взаимодействовать с библиотеками языка Си. Есть даже мнение, что Go-библиотеки — это обертки для C-библиотек.


Чистота кода. Компилятор Go позволяет держать код «чистым». К примеру, неиспользуемые переменные считаются ошибкой компиляции. В Go решается большая часть проблем форматирования. Это делается, к примеру, при помощи программы gofmt при сохранении или компиляции. Форматирование правится автоматически. Подробнее обо всем этом можно узнать в туториале Effective.


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


GoDoc. Утилита, которая очень сильно упрощает документирование кода. Большим плюсом GoDoc является то, что здесь не используются дополнительные языки вроде JavaDoc, PHPDoc или JSDoc. Утилита использует максимальное количество информации, которую она извлекает из документируемого кода.


Обслуживание кода. Его легко обслуживать именно благодаря простому и лаконичному синтаксису. Все это — наследие Google. Поскольку у корпорации огромное количество кода для различных программных продуктов, а также десятки тысяч разработчиков, которые все это разбирают, то появляется проблема обслуживания. Код должен быть понятен всем, кто над ним работает, хорошо документированным и лаконичным. Все это возможно с Go.


При этом в Golang нет классов (есть структуры, struct), нет поддержки наследования, что значительно упрощает изменение кода. Плюс нет исключений, аннотаций и т.п.


Что можно написать на Go


Практически все, за исключением некоторых моментов (например, разработки, связанные с машинным обучением — здесь больше подходит все же Python с низкоуровневыми оптимизациями на C/C++ и CUDA).


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


Востребованность Golang



С течением времени язык становится все более востребованным. Кроме тех компаний, что присутствуют на картинке выше, с Golang работают Mail.ru Group, Avito, Ozon, Lamoda, BBC, Canonical и другие.


«Мы решили масштабировать бизнес, нам важно построить принципиально новую технологическую платформу, которая обеспечит быстрое развитие продукта. Делаем ставку на Go из-за его скорости и надёжности, а главное — аудитории программистов, которая его использует», — заявили представители Ozon в 2018 году, после того как компания приняла решение перейти на Golang.


Ну а что насчет доходов заработная плата Go-разработчика в прошлом году составила в среднем 60-140 тыс. рублей по данным «Моего Круга». По сравнению с 2017 годом этот показатель увеличился на 8,3%. В 2019 году, скорее всего, рост продолжится, поскольку разработчики Golang нужны очень многим компаниям.


Что дальше?


Останавливаться в развитии Golang точно не будет. Потребность в хороших специалистах, которые знают этот язык, будет только возрастать, так что работу специалисту (начинающему или профи) найти будет несложно. В принципе, это утверждение актуально и сейчас, поскольку на рынке IT наблюдается постоянный дефицит разработчиков.


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


Статья готовилась совместно с преподавателем курса Golang в GeekBrains Сергеем Кручининым, за что ему огромное спасибо!

Комментарии (67)


  1. androidovshchik
    08.04.2019 18:58

    Go-Рик… Теперь я видел все, связанное с этим сериалом)


  1. Gemorroj
    08.04.2019 19:10
    +1

    Почему бы не написать о недостатках? Заколебали уже, если честно, писать о Go как о серебряной пуле.


    1. gnomeby
      08.04.2019 19:17
      +2

      Кажется каждая вторая статья про Go на хабре освещает недостатки.


      1. potan
        09.04.2019 13:36

        Наверно это случайно получается?


        1. gnomeby
          09.04.2019 17:24

          Нет, в компенсацию вот таким вот статьям.


    1. evocatus
      08.04.2019 23:30
      +4

      Я выучил Go (уже зная C, Python и Lua), начал делать на нём side проект для web и пожалел об этом.
      Самый большой недостаток Go — это ad-hoc полиморфизм.
      Нафиг, только динамическая типизация или нормальные системы типов (как в F#, например).
      К тому же (имхо) нет ниши, в которой Go был бы уникален. Контейнеры? А теперь почитайте что нагородили разработчики Kubernetes — фактически свою систему типов (с generics, да) поверх Go:

      In short, Kubernetes has built a type naming & identification scheme and a type registry to store each GVK. It took me a long time to identify (pun intended!) this whole thing in the codebase; after I did, I was amazed and impressed.

      The core team replaced a compile-time language feature that was missing (Generics) with their home-built runtime system. And given the tools at their disposal, they did a pretty good job.


      1. acmnu
        09.04.2019 10:54
        +2

        К тому же (имхо) нет ниши, в которой Go был бы уникален.

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


        Думаю Go оседлал два тренда: минимизация окружения в рантайм и параллельность с минимальными паузами GC.


        1. ilyapirogov
          09.04.2019 18:25

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


          GOARCH=arm GOOS=linux go build


          Копируем бинарник через telnet и все работает.


        1. tendium
          09.04.2019 18:56

          Я его выбрал из-за того, что в продакшн у нас шла лишь одна бинарка: в scratch image докера добавлялась бинарка и потом всё шло в кубернетес. Очень удобно. Разбер образа составлял ~12 МБ В случае с ПХП и Руби, всё было несколько сложнее (ну и размер посложнее). На гоу оказалось очень быстро и эффективно писать различные микросервисы в качестве посредника между внутренней кухней и фронтендом, а также демоны для работы с очередями, и просто микроутилитки. Я бы взвесил все за и против, если бы нужно было писать что-то увесистое, но в случае с микрослужбами в прямом смысле первой части слова — «микро», я ни разу не пожалел, что сделал такой выбор.


      1. evocatus
        11.04.2019 13:20

        Второй недостаток Go (имхо) — отсутствие tail-call optimization


  1. Gorthauer87
    08.04.2019 19:13

    А что сказать то хотели?


    1. OnYourLips
      09.04.2019 08:49
      +1

      Статья Материал выглядит, как переваренное (с соответствующим качеством) околоайтишным копирайтером введение к не очень качественной книге по Go.
      Курсы рекламируют.


    1. storm_r1der
      10.04.2019 11:11

      Поддерживаю: я так и не понял, зачем же мне учить Go)


    1. aPiks
      12.04.2019 15:09

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


  1. BOOTLOADER
    08.04.2019 19:22
    +13

    Я тоже не понял зачем ещё одна такая статья.


    1. jeConf
      08.04.2019 20:01
      +4

      Похоже, это мотивирующая напоминалка. Срабатывает раз в месяц.


    1. xState_level80
      08.04.2019 22:43
      +4

      Я только в конце понял зачем. Реклама курса.


  1. alsoijw
    08.04.2019 19:26
    +9

    Есть интересные статьи про go: о сборке мусора, об оптимизациях, о том как работают интерфейсы/структуры/… и есть очередная реклама.


  1. ligor
    08.04.2019 19:34
    +1

    И где там UI? Пока только биндинги.


    1. jeConf
      08.04.2019 20:07
      +1

      Спешить некуда. Ещё не все изобрели свои велосипеды.


    1. sergeysy
      10.04.2019 11:11

      в связке html,css, js замечательно работает, лучше всяких QT, C#


      1. worldbeater
        10.04.2019 12:10

        А есть примеры real-world-проектов с кроссплатформенным GUI на GO? Существует реализация реактивных расширений для GO, было бы интересно посмотреть на что-нибудь в связке с ней — а у них в ридми нет ссылок на готовые проекты :(


        1. sergeysy
          10.04.2019 12:56

          Я на работе использую в связке с vue.js и jQuery. Go умеет быть файловым сервером, пишется это в одну строчку. Далее пишется фронт на любом любимом фреймворке, и общение между фронтом и шоу по rest API. Приложения десктопные И такая связка реализуется в продукте быстрее чем на qt, при том что я ни вёрстку, ни веб разработку не умел и всё это с нуля учил в отличие от qt или c# с его winforms или ещё какой фиговиной


          1. qrKot
            10.04.2019 20:29

            Далее пишется фронт на любом любимом фреймворке, и общение между фронтом и шоу по rest API.


            Это замечательно, и я вообще не отрицаю, что Go для бека офигенен. Но обещали таки UI…


  1. gudvinr
    08.04.2019 20:12
    +2

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


    • деньги и спрос на рынке труда
    • желание изучить этот язык

    Остальное — вода


    1. Yeah
      08.04.2019 20:43

      При этом "желание изучить этот язык" проистекает из денег и спроса на рынке труда


      1. Tangeman
        08.04.2019 21:23
        +2

        Не всегда. Иногда язык выбирается исходя из того как быстрее сделать какой-то проект (или хотя бы прототип). Но в этом случае Go не дает никаких преимуществ, если человек уже знает что-то из C/C++/C#/Java. Если производительность не играет существенной роли, то сюда можно добавить знание любого другого языка.

        Правда, есть ещё категория энтузиастов, которые чисто из вредности решают задачи на не очень подходящим для них языке (те самые которые пишут веб-сервера на bash или редакторы текста на postscript) — они вряд-ли интересуются деньгами или спросом на рынке труда.


        1. FForth
          09.04.2019 05:47

          А, где посмотреть на редактор на PostScript?


          1. Tangeman
            09.04.2019 13:55

            Боюсь уже не найду, это было больше 10 лет назад. Помню только что автор был какой-то студент из MIT, написал его под ghostscript. Я был впечатлён и поэтому запомнил.


          1. borshak
            09.04.2019 19:14

            Вот здесь есть примеры приложений на PostScript — http://www.anastigmatix.net/postscript/direct.html


      1. mapron
        08.04.2019 21:23

        Может у вас так, но это не значит что у всех так. Сомневаюсь что люди изучают как написать программу на Malborge, потому что на этом языке есть вакансии) Для тех же функциональных языков это может быть «потому что это о*уенно»
        да просто посмотрите блог «ненормальное программирование»


  1. BkmzSpb
    08.04.2019 21:16
    +10

    Рискуя нарваться на минусы, все же попытаюсь разобраться и понять, о чем речь в статье. Со стороны звучит так, будто бы статья должна заинтересовать меня (некоего абстрактного разработчика) и разрекламировать мне Golang. Представим на минуту, что я ни разу не видел даже строчки кода на Go (это близко к правде). Какие у языка преимущества (судя по статье):


    1) Простота. Собственно, это была основная цель создания языка, и ее удалось достичь. У Go достаточно простой синтаксис

    Верю на слово, но т.к. рядом нет ни строчки кода, мне сравнить не с чем.


    2) Большое количество библиотек. Если вам не хватает какой-либо возможности в Go, можно воспользоваться одной из множества библиотек и выполнить требуемую задачу. У Go есть еще одно преимущество — можно без проблем взаимодействовать с библиотеками языка Си. Есть даже мнение, что Go-библиотеки — это обертки для C-библиотек.

    Сейчас только ленивый с C-библиотеками не взаимодействует. Ладно, запишем в плюс.


    3) Чистота кода. Компилятор Go позволяет держать код «чистым».

    Игнорируя тот факт, что упомянутая в этом абзаце ссылка — битая, я все-таки не очень понимаю, почему фичей языка являеся форматирование сторонней утилитой? Тогда любая тяжеловесная IDE в нагрузку к энтерпрайз-языку — это тоже "фича" языка? Из текста не ясно, насколько я не прав.


    4) Статическая типизация.

    Верю, что преимущество, но по сравнению с чем?


    5) GoDoc.

    Сторонняя утилита. Чем она проще чем аналоги для других стеков? Может пример есть?


    6) Обслуживание кода. Его легко обслуживать именно благодаря простому и лаконичному синтаксису.

    Я полностью согласен, осталось только увидеть этот "лаконичный" синтаксис в сравнении хоть с чем-то.


    7) При этом в Golang нет классов (есть структуры, struct), нет поддержки наследования, что значительно упрощает изменение кода. Плюс нет исключений, аннотаций и т.п.

    Окей, а чем это заменяется? Что вместо исключений, например?


    8) Что можно написать на Go
    Практически все, за исключением некоторых моментов (например, разработки, связанные с машинным обучением — здесь больше подходит все же Python с низкоуровневыми оптимизациями на C/C++ и CUDA).

    Но у вас же обертки и C-библиотеки. С ними действительно можно написать что угодно.


    9) Все остальное можно писать, особенно это актуально в отношении web-сервисов. Кроме того, на Go стоит разрабатывать приложения как для конечного пользователя, так и для разработки демонов, UI, он подходит для кроссплатформенных приложений и сервисов.

    Ну вот хороший же пример — UI на Go. Я, например, не встречал (потому что мало интересовался). Пример приложения или упрощения рутинных задач по сравнения с более сложными языками был бы очень кстати. Но, как говорится, увы.


    Я открыл статью, потому что захотел узнать, "Зачем мне учить Go", но так и не увидел никакого конкретного примера, почему я должен выкинуть свой древний и бесполезный язык и пересесть на Go, кроме зарплаты. Зарплаты, динамика которой (согласно данным по ссылке на Мой круг) находится на уровне с C# и Python, и катастрофически проигрывает Swift и Objective-C. И да, я не нашел в статье ничего по ключевому слову "инфляция", что, с учетом указанной валюты, мягко говоря превращает эту динамику в 0.


    1. qrKot
      09.04.2019 07:40

      Справедливости ради, gofmt и godoc — часть базового тулинга языка (до кучи с gotest и т.д.). В остальном вы правы, статья на уровне «я прочитал методичку».


    1. tendium
      09.04.2019 11:25

      UI-не-UI, но для фронтенда таки можно писать на go путём компиляции в WebAssembly: github.com/golang/go/wiki/WebAssembly


    1. STO_MIKE
      09.04.2019 13:09

      Касательно UI недавно на HackerNews была новость: github.com/fyne-io/fyne.


    1. ewrokirill
      10.04.2019 11:12

      «Статья готовилась совместно с преподавателем курса Golang в GeekBrains Сергеем Кручининым, за что ему огромное спасибо!»
      Ощущение, что написана статья только ради этого.


  1. xState_level80
    08.04.2019 22:52
    +1

    Из 200+ вакансий не увидел ни одну с node.js/React (2ой по населению город в Греции). Про go уж молчу. Увижу лет через пять наверное… и как обычно будут требовать с 5+ летним опытом


  1. DmitriyTitov
    09.04.2019 05:05

    Не мог бы преподаватель «курса Golang» пояснить мне и некоторым другим прочитавшим статью как сделать UI на Go. Может я чего пропустил, или это просто опечатка?
    Вообще как для Mail статья слабовата, для меня была бы ОК, но не для Mail.


  1. alex103
    09.04.2019 08:10

    Мог бы! Вот заплатите денюшек, пройдёте курсы и будет вам счастье.
    (ну это мой субъективный вывод от статьи)


  1. aivazovski
    09.04.2019 09:24

    Какая же классная картинка, как раз нужна была новая кружка.


    1. MeGaPk
      09.04.2019 12:06

      уже заказал себе новую кружку с этим логотипом :). Спасибо за идею!


  1. mad_nazgul
    09.04.2019 11:11
    -1

    Тема сисек «зачем изучать GO» не раскрыта. :-)

    Будет, он как одни ЯП от Гугла забыт и заброшен.
    Или, например как Ангуляр, переделаны так, что версия 2 будет слабо совместима с версией 1? (Предпосылки к этому есть)


    1. qrKot
      10.04.2019 08:27

      (Предпосылки к этому есть)


      Что за предпосылки?


      1. mad_nazgul
        10.04.2019 14:44

        Как минимум во второй версии будет изменена система модулей.
        Добавлены генерики и обработка исключений.
        Возможно что-то еще измениться.
        В общем будет ка было с Ангуляр.


        1. tendium
          10.04.2019 19:39

          Как минимум во второй версии будет изменена система модулей.

          Шо опять?! Я только приспособился к go mod («vgo»)… Можно пруф?

          Добавлены генерики

          Это не совсем и дженерики будут, но это лишь расширение языка, не нарушающее обратную совместимость.

          и обработка исключений.

          Серьезно? Можно пруф? Введение исключений в язык — это ведь фундаментальное изменение, которое не факт, что комьюнити примет.


        1. qrKot
          10.04.2019 20:39

          Как минимум во второй версии будет изменена система модулей


          Ну, собственно go modules есть и работает уже сейчас. Ничего из breaking changes не замечено.

          Добавлены генерики


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

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

          обработка исключений


          Вы это где прочитали? То, что должен появиться некоторый «сахар» для обработки ошибок — да, и не только должен появиться, но уже есть. Опять же ничего не сломалось. А по поводу исключений (специально перепроверил) позиция прежняя: ошибка — это значение, т.е. исключений нет и не предвидится.

          Вы, в общем, хотя бы из оригинала golang-blob информацию брать попробуйте, что ли, а не из желтой прессы. Там вам прямо и расскажут: «так, мол, и так, развитие языка идет итеративно, в планах сахар для обработки ошибок, некоторые фичи обобщенного программирования, типа-дженерики, возможно на встроенной кодогенерации, а может что-то другое придумаем, пробуем разные подходы. Модули — можете уже пользоваться, это некоторая итерация чуточку более продвинутого вендоринга. Вторая версия — ну, вероятно, чтобы зафиксировать завершение этапа запланированных расширений синтаксиса, версию после 1.6 переименуем в 2.0. Но это так — поржать, по сути слома совместимости не планируется. Язык будем держать как можно более простым, ничего из того, что в планах, поломать что-то не должно».

          Ну, в общем, Go не Swift, ломать что-то не собираются. Собственно, гуглу это не выгодно. У него на Go достаточно большая кодовая база, переписывать никто не хочет.


  1. Eugene-123
    09.04.2019 13:09
    +1

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


    1. chesterset
      09.04.2019 14:30

      В таком случае вам больше ничего не мешает начать его изучать:
      https://blog.golang.org/go-brand


  1. potan
    09.04.2019 13:40
    -1

    «Го является таким же мощным, как С++» при его механизмах обобщенного программирования — явная неправда.


  1. ilyapirogov
    09.04.2019 19:23
    +1

    Внесу немножко позитива :)


    Лично мне Golang понравился своим вниманием к мелочам. Каждый преподносимый здесь плюс не тянет на киллер фитчу, будь то:


    • Встроенные утилиты godoc, gofmt, go test, go generate, etc
    • Установка пакетов из любых git репозиториев
    • Распараллеливание одним ключевым словом
    • Статическая кросс-компиляция из коробки
    • WebAssembly опять же из коробки
    • Очень простые и удобные стандартные пакеты, такие как rpc или flag
    • И многое других мелочей, что сразу не приходит в голову.

    По отдельности здесь нет ничего особенного. Например в других языках есть JavaDoc, PyDoc, LuaDoc и куча разных утилит к ним; Линтеров и форматоров вагон к любому языку — выбирай на вкус. Для кросс-компиляции достаточно банч пакетов через apt/yum/portage поставить, итп.


    Но удобоство Golang в том, что: a) все это сразу доступно из коробки, скачал — и можно сразу работать; б) они очень удобные и продуманные; в) благодаря предыдущим пунктам, большинство пакетов используют единый подход, что сокращает зоопарк библиотек и подходов и очень сильно упрощает анализ чужого кода.


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


  1. skovpen
    09.04.2019 19:28

    При этом в Golang нет классов (есть структуры, struct), нет поддержки наследования, что значительно упрощает изменение кода. Плюс нет исключений, аннотаций и т.п.

    А это что, если не наследование?
    package main
    
    import "fmt"
    
    type A struct {
            x int
    }
    
    func (a *A) SetX(x int) {
            a.x = x
    }
    
    type B struct {
            y int
            A
    }
    
    func (b *B) SetY(y int) {
            b.y = y
    }
    func (b *B) GetResult() int {
            return b.x * b.y
    }
    func main() {
            f := B{}
            f.SetX(2)
            f.SetY(4)
            fmt.Printf("2*4=%d\n", f.GetResult())
    }


    1. tendium
      09.04.2019 19:42
      +1

      Это весьма условное «наследование». К полю можно получить доступ и так, например:

      fmt.Printf("%v\n", f.A.x)

      По сути это встраивание полей и методов, связанных со структурой A, в структуру B.


      1. skovpen
        10.04.2019 13:23

        как бы всем троим ответить :-)
        Можете привести пример наследования на C++, который не реализуется в GO?


        1. tendium
          10.04.2019 13:33

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


          1. skovpen
            10.04.2019 19:50

            по сути, в go, если структуры в одном package, то при встраивании, их поля/методы с маленькой буквы — protected, если в разных — private. с большой — в обоих случаях public.


            1. tendium
              10.04.2019 20:03

              Это какое-то жонглирование понятиями. Попробуйте данное дело провернуть с пакетом («библиотекой»). Сможете ли вы пользователям пакета («библиотеки») предоставить protected-методы и поля? И в качестве контрольного выстрела: можете ли вы затем изменить видимость protected на public?

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


              1. skovpen
                10.04.2019 20:23

                1. провернуть с «библиотекой» можно только private/public. private/public/protected можно исключительно в своём проекте «жонглировать». изменять видимость нельзя.

                2. Полностью согласен.


        1. gudvinr
          10.04.2019 20:39
          +1

          Как минимум, вы не сможете находясь в области видимости A вызвать функции B:


          type A struct { x int }
          
          func (a *A) GetX() int {
                  return a.x
          }
          
          func (a *A) Get() int {
                  return a.GetX()
          }
          
          type B struct {
                  y int
                  A
          }
          
          func (b *B) GetX() int {
                  return b.x + 1
          }
          
          func (b *B) Get() int {
                  return a.Get() + b.y
          }
          

          Если вызвать b.Get(), то, очевидно, вызовется a.GetX(), а не b.GetX().
          В случае с C++ достаточно сделать так:


          class A {
              virtual int GetX();
          }
          

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


        1. qrKot
          10.04.2019 20:52
          +1

          Можете привести пример наследования на C++, который не реализуется в GO?


          Ну, как бы, любое наследование в C++ будет ярчайшим примером того, что не реализуемо в Go… Нету в Go наследования, только композиция.

          С плюсах есть virtual-семантика, например, которая в Go нереализуема в принципе.

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

          Наследник в C++ скрывает детали реализации родителя, в Go — нет. Вы всегда можете «достучаться» до встроенного типа из «потомка».

          Модификаторы доступа и области видимости достаточно чувствительно разнятся. В Go модификаторы доступа — уровня пакета, в плюсах — на уровне класса.

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


    1. gudvinr
      09.04.2019 23:49

      Композиция — это не наследование. Один из способов применения ООП, но не наследование.


    1. qrKot
      10.04.2019 08:33

      А это что, если не наследование?


      Встраивание, емнип.


  1. adombrovsky
    10.04.2019 10:04

    Тот неловкий момент, когда комментарии интереснее статьи


  1. woto
    11.04.2019 07:17

    Скажите, мне одному показалось, что в нём нет инструментов для быстрой обработки XML?
    (столкнулся в процессе обучения по туториалам)


    1. tendium
      11.04.2019 08:28

      Есть же стандартный пакет: golang.org/pkg/encoding/xml


      1. woto
        12.04.2019 02:56

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


    1. qrKot
      11.04.2019 09:51

      А что вы подразумеваете под «быстрой обработкой XML»?

      Если «анмаршаллить из XML, маршаллить в XML» — есть, и даже в стандартной библиотеке есть.

      Если вам SOAP нужен, xsd-схемы и все вот это — тогда да, ничего приличного нет, по большей части из соображений невысокой востребованности, имхо.


      1. woto
        12.04.2019 02:57

        Да куда там. Я остановился просто на чтении/парсинге. И кажется ни одного у меня такая же проблема. github.com/golang/go/issues/21823