Язык Go с точки зрения PHP-разработчика

    Go — это язык, придуманный Робертом Гризмером (Robert Griesemer), Робом Пайком и Кеном Томпсоном, который был анонсирован в ноябре 2009 с версиями под Linux и Mac OS X. Сейчас разработчики работают в Google, но и задолго до этого были очень известными и уважаемыми людьми (к примеру, кодировка UTF-8 была изобретена Томпсоном и Пайком для использования в качестве основной кодировки в Plan 9).

    Лично я решил посмотреть, что это за язык после того, как тут опубликовали вот это видео выступления Роба Пайка. Я изучаю Go не очень долго, но даже за те две недели, что я потратил на его изучение, я успел сделать несколько проектов на нём, например backend для библиотеки JsHttpRequest (JsHttpRequest; мой backend на Go). Я до сих пор использую JsHttpRequest из-за её удобства (как со стороны JS, так и со стороны PHP). В статье я хочу рассказать исключительно о моих ощущениях после программирования на PHP и JavaScript, практически без примеров кода.

    В двух словах о языке


    Официальный сайт проекта — http://golang.org. Там есть краткий tutorial, описание языка и встроенных пакетов (packages), а также ссылки на Wiki, бенчмарки и на список сторонних пакетов.

    Go — статически типизированный язык со сборщиком мусора, который по ощущениям похож как на Си, так и на Javascript (многие конструкции также напоминают другие языки, например Python, Pascal и Java). Go — это компилируемый язык, причём компилируемый в нативный исполняемый код (в отличие от Java и .NET) и по производительности он достаточно близок к Си.

    У языка немного странноватый синтаксис (например, определение строки str выглядит как str string, а не string str, как почти во всех других языках), встроенная поддержка UTF-8, immutable strings (неизменяемые строки) и поддержка динамической типизации с помощью интерфейсов (не путать с интерфейсами в других ООП языках)

    Примеров кода я буду приводить минимум — если хотите взглянуть на код на Go, рекомендую ознакомиться с туториалом.

    Почему язык рассматривается с точки зрения PHP-разработчика, а не <Java, .NET, Ruby, Python, ...>?


    Я невольно сравниваю с PHP потому, что я начинал программировать на PHP, до сих программирую на нём на протяжении порядка 7 лет с небольшими перерывами и мне хотелось увидеть какой-нибудь язык, который бы принципиально чем-то отличался от PHP, но при этом был пригоден для веба. Конечно, язык от Google второму критерию не может не удовлетворять, поэтому я решил обратить на него внимание :).

    Не совсем корректно сравнивать PHP и Go, поскольку это языки различного назначения — они скорее дополняют друг друга, но я всё же решил сравнивать Go и PHP в той сфере, для которой PHP заточен — для создания веб-сайтов

    Достоинства по сравнению с PHP


    — Компилируемый язык со статической типизацией, что позволяет достичь превосходной производительности (в 10-100 раз быстрее, чем PHP)
    — Как нельзя лучше подходит для написания системных утилит и демонов
    — Исключение огромного числа runtime ошибок за счёт строгой типизации
    — Исключительная поддержка Unicode и UTF-8: исходные тексты и строки обязательно в UTF-8, богатые встроенные механизмы для работы с UTF-8
    — Отличные возможности многопоточного и параллельного программирования (concurrent and parallel)
    — Тесная интеграция с API *nix-систем, грамотно организованные внутренние структуры данных для работы с системой и файлами
    — Хорошая поддержка последних веб-стандартов, например WebSocket API

    Недостатки по сравнению с PHP


    — Недостаточная интеграция с Apache (только работа как standalone веб-сервер или FastCGI от сторонних разработчиков)
    — Язык с не до конца устоявшимся синтаксисом и возможностями — некоторые проекты на Go, которым меньше года, уже не компилируются
    — Отсутствие динамического подключения кода (невозможность загрузки и выгрузки, скажем, *.so-файлов на лету)
    — Намного менее удобные в использовании динамические возможности
    — Мало сторонних библиотек — кроме как к MySQL, PostgreSQL и NoSQL-базам не подключишься
    — Отсутствие официальной поддержки Microsoft Windows®
    — Желательно иметь опыт программирования на Си, чтобы лучше понимать семантику языка

    Ощущения в целом


    Go — это первый язык со статической типизацией, который я видел, где она не очень мешает программировать и не заставляет писать в 2-3 раза больше кода, чем на PHP или JavaScript. Также, Go компилируется в нативный код, и позиционируется как язык для написания системных утилит и демонов. Язык и компилятор не вызывают ощущения чего-то монстрообразного и неповоротливого, как Java или .NET (что, собственно, и является основной причиной, почему я не пишу на Java).

    С другой стороны, чувствуется, что язык всё ещё бурно развивается (например, на моих глазах за один день нарисовался package под названием html, который появился почти сразу после того, как я скачал и установил себе Go-окружение, так что пришлось собирать его заново :)). Также, как замена PHP он подходит не очень хорошо, потому что для каждого хоста приходится писать целый веб-сервер и следить за тем, чтобы он случайно не упал :), а также нужно отдельно заморачиваться с запуском этих демонов при перезагрузке сервера, к примеру. Я молчу, что на виртуальном хостинге максимум, что у вас получится сделать на Go — это подключить свои CGI-обработчики на Go, что будет работать не сильно быстрее PHP, если будет работать быстрее вообще.

    В целом, сам по себе язык и встроенныие библиотеки являются достаточно стабильными, чтобы Go можно было использовать на продакшне (например golang.org сам работает под управлением сервера на Go, а именно — это просто godoc, запущенный с ключиком -http="...:80"). Но, поскольку опыта в сетевом и системном программировании у меня не так много, как мне хотелось бы, я довольно часто натыкаюсь на ошибки в использовании библиотек, которых можно было бы избежать, если бы у меня был опыт сетевого программирования и написания демонов. Но, в целом, как мне кажется, если вы хотели изучать Java или ASP.NET, попробуйте лучше Go — вряд ли этот язык оставит вас равнодушным.
    Поделиться публикацией

    Комментарии 107

      +2
      Мало сторонних библиотек — кроме как к MySQL, PostgreSQL и NoSQL-базам не подключишься
      Парсер сломался, что значит эта фраза?

      Если быть честным, Go — это первый язык со статической типизацией, где она не очень мешает программировать и не заставляет писать в 2-3 раза больше кода, чем на PHP или Javascript.
      Наверное, не «это первый язык со статической типизацией», а «это первый язык со статической типизацией, который я знаю». Вывод типов в Haskell и Nemerle помогает не писать простыни описания типов.

      Сравнивать framework для разработки веб приложений (ASP.NET) с ситемным языком — это сильно.
        0
        Наверное, не «это первый язык со статической типизацией», а «это первый язык со статической типизацией, который я знаю». Вывод типов в Haskell и Nemerle помогает не писать простыни описания типов.

        Поправил, я действительно не имел ввиду, что это вообще первый язык со статической типизацией, в которой это сделано достаточно удобно :)

        Мало сторонних библиотек — кроме как к MySQL, PostgreSQL и NoSQL-базам не подключишься

        Парсер сломался, что значит эта фраза?

        Это значит, что для подключения к MS SQL Server или Oracle требуется использовать библиотеки на Си, что на Go не очень удобно.
          0
            0
            Эта библиотека ужасно неудобна в использовании, по крайней мере на первый взгляд. Мне кажется, для Go можно было бы придумать более удобный API… Уж проще тогда подключить нативную библиотеку на Си для работы с соответствующей СУБД и написать к ней простенькую обертку, чем использовать такой код, хоть и универсальный :)
        0
        Сделайте сравнение с языком со статической типизацией, плз. С той же Java, к примеру.
          –1
          Единственное, с чем я могу сравнить — это с Си, поскольку ни с Java, ни с .NET я особо не работал (инструменты для написания на Java (например Eclipse) или .NET (Visual Studio) работают уж очень неповоротливо, что меня ужасно раздражает).

          Если кратко, то Go — это Си со сборщиком мусора и сравнимый по удобству с PHP. Для меня этого было достаточно :).
            –12
            Неповоротливо на вашем допотопном компе вы хотели сказать? У всех ничего не тормозит.
            Строгая типизация это то что останавливает попробывать python или ruby — я хочу контролировать и видеть какой тип у обьекта
              +12
              Джава вообще никогда ни разу не тормозит. А скажете, что где-то тормозит — Оракл вас засудит.
                –3
                Вы не поверите, но есть Real-Time Java. От того же Oracle. И она действительно сертифицирована на real time
                  +9
                  На очень, очень медленный риал-тайм.

                  (real time != быстро, real time == фиксированное время реакции).
                    +1
                    Ну, справедливости ради, надо отметить, что пиковая производительность у Java выше, чем у Go в текущей реализации языка и с текущими реализациями часто используемых алгоритмов (см. довольно популярный бенчмарк). Но производительность программ на Java лично меня обычно не воодушевляет, наверное я что-то не так делаю :)
                      0
                      Кстати, в этом бенчмарке Go не так и плох, сравнимо с Java/C#, местами лучше, но так нехило просаживается на тестах binary-trees и regex-dna. Интересно бы узнать, почему.
                        +1
                        На двоичных деревьях там есть альтернативная реализация с free list, которая не показывает такого провала в производительности, что дает основания полагать, что это проблема в GC. А regex-dna тормозит из-за того, что библиотека регулярных выражений написана с нуля на самом Go
                          0
                          А, точно, сами разработчики пишут, что у них какая-то затычка вместо нормальной библиотеки регулярок. Странно это, уж что-что, а регулярки-то могли отдельной эффективной библиотекой добавить, чтобы так в тестах не сливать. Видимо, у них другие цели.
                            0
                            Проблема та же самая, что в C# с взаимодействием между managed code и unmanaged code — в Go есть сборщик мусора, в остальных языках, вроде Си, его нет, и взаимодействие между кодом на Си и на Go немного затруднено. Вроде как была раньше обертка для PCRE на Go, но разработчики Go действительно очень любят решения на самом Go, а не привязываться к библиотекам на Си (что можно понять, в общем-то :))
                              0
                              Так в данном случае не нужно мешать управляемый код с неуправляемым, просто позвать внешнюю динамическую библиотеку. Учитывая нацеленность Go на скорость, было бы логичнее и в этом случае ориентироваться на неё, а не на то что там разработчики любят :)
                                0
                                Честно — не знаю :). В конце концов, на Go можно позволить себе такую роскошь, как посимвольный разбор там, где пришлось бы иначе писать очень сложные регулярные выражения, и лично мне это нравится :). А простенькая библиотека для регулярных выражений в Go итак есть. Если хочется сочинять какие-то очень сложные реги, надо подумать о том, какой смысл тогда вообще писать на Go, ведь сложные регулярные выражения работают в целом очень медленно…
                                  0
                                  А код библиотеки разве не в текущем процессе выполняется? Если так, то эти «простые» вызовы могут привести к потере памяти.
                                    0
                                    В смысле, к утечке.
                              +2
                              Не поверите: в Java библиотека регулярных выражений написана на Java.
                            0
                            Странно, но NYSE использует JBoss, который написан на java. А у них там до 100000 транзакций в секунду.
                            0
                            >> real time == фиксированное время реакции
                            О противоположном никто не говорит. Но RT для java есть.
                            А вот какие характеристики у GC в Go?
                              0
                              Разработчики сейчас работают над real-time Garbage Collector'ом для Go. На данный момент он не является реалтаймовым.
                          0
                          Вопрос не в том, что Оракл засудит. В работе с Java надо учитывать две особенности:
                          — время старта и «разогрева» VM, и
                          — неродной для операционной системы GUI.

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

                          А еще со временем Java становится быстрее. Пять лет назад на моем ноутбуке IDEA и Eclipse еле ворочались, а сейчас фактически летают, и железо я не обновлял — только JDK :)
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            У Ruby и Python динамическая типизация.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                –4
                                чё?:)
                                • НЛО прилетело и опубликовало эту надпись здесь
                                    –3
                                    Разницу между строгой типизацией(статической) и динамической типизацией представляете? То что у ruby написано строгая динамическая типизация не означает что она статическая.

                                    Вообщем присваивать тип переменной во время присваивания значения — меня не устраивает.
                                      +1
                                      Термин не очень-то строгий, много значений:

                                      en.wikipedia.org/wiki/Strongly_typed_programming_language

                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          the term strong typing is used to describe those situations where programming languages specify one or more restrictions on how operations involving values having different data types can be intermixed. Its antonym is weak typing

                                          Прочитайте еще раз процитированное. Внимательно. Это никак не относится к статической типизации, то есть к типизации во время компиляции. Это только лишь о том, что есть связанные с типами ограничения. В рантайме они применяются, или во время компиляции — не уточняется.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Пардон, не понял сразу, на какой вы стороне.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            +1
                                            Фух мне уже всё равно честно, я там не правильно построил предложение из-за спешки и теперь весь сыр бор.

                                            Именно так, хорошо будем называть её статической а не строгой.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                  +2
                                  Строгая динамическая типизация, что не есть статическая типизация
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      –1
                                      Я в том коментарии пропустил слово «отсутствие строгой типизации» а не её наличие…
                                  +1
                                  >Язык и компилятор не вызывают ощущения чего-то монстрообразного и неповоротливого, как Java или .NET (что, собственно, и является основной причиной, почему я не пишу на Java).

                                  Не знаю, как у вас, у меня csc (C# compiler) за секунды отрабатывает, ни разу не вызывая ощущения монстрообразности, в отличие от компании Google…

                                  Компилятор C или Java там рядом не валялись по скорости… C — из-за инклюдов, а Java — из-за jar-файлов…

                                  В языке PHP удобства, как и у многих на даче, на улице… :)
                                    0
                                    Компилятор C# может и работает быстро, а вот зато сами приложения на C# высокой скоростью работы (а особенно первоначальной загрузки программы) как-то не отличаются…

                                    Помимо этого, в Go компиляция всего package tree занимает порядка 5 секунд (а там полтыщи только .go-файлов)…

                                    В языке PHP удобства, как и у многих на даче, на улице… :)

                                    Хм, для своих задач — разработка веб-страниц, ИМХО, PHP отлично подходит, в основном благодаря очень богатым встроенным возможностям. Дальше троллить на эту не очень хочу, если честно.
                                      +2
                                      а вот зато сами приложения на C# высокой скоростью работы (а особенно первоначальной загрузки программы) как-то не отличаются

                                      Ну это, строго говоря, неправда.

                                        +1
                                        >Компилятор C# может и работает быстро, а вот зато сами приложения на C# высокой скоростью работы (а особенно первоначальной загрузки программы) как-то не отличаются…

                                        Ngen при инсталляции вашей программы вам в помощь… Сразу все летать будет, главное, не лениться, добавить строчку в инсталляционный скрипт.
                                          0
                                          По моему опыту, отngen'енные приложения как-то помедленнее работают. Лучше уж пусть программа 2-3 секунды JIT'ится при запуске. Особенно это критично для серверного ПО (а там вообще сервер стартовать может по несколько минут, причём отнюдь не по вине JIT'а).
                                          –1
                                          1) Visual Studio 2010, по моим ощущениям, не тормозит;
                                          2) Игры на XNA вообще летают.
                                            –1
                                            Уточню про первый пункт — весь интерфейс сделан на WPF, соответственно .NET.
                                              0
                                              Visual Studio 2010 — да, вроде как пошустрее работает, чем 2008, но тоже тормозов на каждом шагу хватает…
                                                –1
                                                Что означает, что код на .NET по вашим субьективным ощущениям оказался быстрее нативного кода + нативного АПИ GDI etc.
                                          0
                                          Java-компилятор, несмотря на то, что пробегается по jar'ам, тоже очень быстр, срабатывает за секунды даже в больших проектах. Проблема в первую очередь касается C++ и C, из-за того, как обрабатываются include-файлы.
                                        +2
                                        А чо не с Фортраном?
                                        Если с чем-то сравнивать, я голосую за Nemerle (CLR) и Scala (JVM). А там и смотреть на результаты
                                        0
                                        Фреймворки есть какие-то или или написание любого проекта начинается с «биндимся к 80-му порту, слушаем, разбираем запрос, формируем ответ начиная с „HTTP/1.1 200 OK“, ...»?

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

                                        Это требование языка? Нельзя написать сервер, обслуживающий несколько хостов?
                                          +2
                                          Фреймворки есть какие-то или или написание любого проекта начинается с «биндимся к 80-му порту, слушаем, разбираем запрос, формируем ответ начиная с „HTTP/1.1 200 OK“, ...»?

                                          Встроенный package http делает бОльшую часть «грязной работы» за вас, за исключением того, что он пока что не умеет парсить multipart/form-data (в моем backend для JsHttpRequest это по сути единственная вещь, которую мне пришлось реализовывать вручную).

                                          Т.е. простейший веб-сервер выглядит вот так:
                                          package main

                                          import (
                                          "http"
                                          "io"
                                          "log"
                                          )

                                          // hello world, the web server
                                          func HelloServer(c *http.Conn, req *http.Request) {
                                          io.WriteString(c, "hello, world!\n")
                                          }

                                          func main() {
                                          http.HandleFunc("/hello", HelloServer)
                                          err := http.ListenAndServe(":12345", nil)
                                          if err != nil {
                                          log.Exit("ListenAndServe: ", err.String())
                                          }
                                          }


                                          Как видно, работы с сокетами тут не требуется :). Но для поддержки виртуальных хостов надо самому парсить заголовок Host: (т.е. прочитать req.Header[«Host»]) и использовать соответствующий switch/case :).
                                            0
                                            Спасибо за ответ и пост, надо будет попробовать. По идее в связке с nginx должен летать
                                              0
                                              Я думаю, что если у Вас есть отдельный свободный IP, то лучше повесить веб-сервер прямо на него, а не через nginx — я не уверен, что, к примеру, WebSocket будет работать нормально через reverse proxy от nginx.
                                                0
                                                Отдельный IP не проблема, к тому же можно какой-нить 8080 порт использовать для чистой статики (графика, css, js), но тут вопрос, смогу ли я написать веб-сервер, выбирающий из кэша (на ФС ли, или, например, memcached) кэш динамических страниц также эффективно как nginx.

                                                О вебсокетах пока не думал, хотя пора, но, наверное, в случаях со сложностями в проксировании именно обработчик сокетов лучше повесить на отдельный IP/порт, а сообщения от сервера к клиенту при необходимости кэшировать на уровне приложения
                                          +2
                                          Так все-таки, зачем нужен язык Go с точки зрения PHP-разработчика? Откройте секрет:)
                                            +1
                                            Для написания высокопроизводительных демонов или системных утилит — в качестве альтернативы PHP с высокой производительностью
                                              +4
                                              Как альтернатива PHP для написания системных утилит?? Видимо, я что-то пропустил в этой жизни… о_О
                                                0
                                                На PHP тоже можно писать системные утилиты, но он для этого плохо подходит — банально приходится больше кода писать :). Демоны тоже можно писать, но это тоже считается не айс (и часто это действительно так).
                                                  +2
                                                  На брейнфаке тоже «можно», но если кто-то вдруг напишет «язык Go — хорошая альтернатива брейнфаку для написания системных утилит», то его точно упекут в дурку. Ну либо (в зависимости от контекста высказывания) будут очень плохого мнения о языке Go, раз уж он является хорошей альтернативой лишь брейнфаку %)

                                                  Теперь серьёзно: если рассматривать язык в качестве кандидата на написание системных утилит, то сравнивать нужно с языком, который используется для этой цели в 95% случаев, а не с языком, на котором «можно» их писать.
                                                    0
                                                    Ну, я согласен, эта формулировка может быть не совсем точной :). Я имел ввиду, что Go — это язык, который подходит для системного программирования и написания высокопроизводительных демонов, и при этом его не менее приятно и удобно использовать для этих целей, чем PHP — для веб-разработки :).
                                                      +1
                                                      А что, правда PHP приятно использовать? О ужас!
                                                0
                                                попробуйте node.js ;)
                                                  0
                                                  А почему просто не компилировать код связкой HipHop+C-compiler? Я в соседнем посте про него уже заикался, но повторюсь.
                                                    0
                                                    Ну, при системном программировании (и при разработке баз данных, к примеру), статическая типизация была бы очень кстати и очень удобна. На самом деле, системные утилиты на Go писать даже удобнее, чем на PHP…
                                                0
                                                На нём только консольные приложения писать можно, или графический GUI тоже есть?
                                                  0
                                                  Binding'и к X11 и к GTK имеются, но они в разработке. В целом, в Go особый упор на GUI не делается, скорее разработчиками просто декларируется поддержка GUI, если Вы сами напишите враппер на Go к соответствующим библиотекам :).
                                                  –1
                                                  Давно пора, миру необходим новый статический язык с компиляцией в нативный код. Идеальный такой язык должен унаследовать синтаксис от c/c++, а типизацию от pascal'я и избавится от нетривиальных конструкций.
                                                    +2
                                                    > типизацию от pascal
                                                    очень смешно :-)
                                                      –2
                                                      А что, типизация в си/с++ это настоящий цирк, там ее нет по сути. Динамическая типизация для такого языка не подходит.
                                                        +2
                                                        Ну, есть как бы и гораздо более современные и полезные системы типов, чем примитивнейшая паскалевская.
                                                          –3
                                                          Стоит поучится теории построения компиляторов, а потом говорить какая система примитивная, а какая нет.
                                                            +3
                                                            Вы это мне говорите?!? Не, серьёзно?

                                                            В паскале самый примитивный вариант type propagation. Проще вообще ничего не бывает, даже в Си система типов сложнее, потому как там есть этот гнусный неявный array to pointer decay.

                                                            Хотите узнать, что такое сложные и мощные системы типов? Хотите поучиться сначала, а потом говорить другим, чему им стоит учиться? Ну начинайте, вперед:

                                                            www.cse.chalmers.se/~ulfn/papers/afp08/tutorial.pdf

                                                            coq.inria.fr/doc/toc.html

                                                            www.lambdassociates.org/Book/page143.htm
                                                            0
                                                            Почти у всех у них ноги растут из паскаля. А точнее, из оберона и модулы.
                                                              0
                                                              у паскаля собственные ноги растут из алгола =)

                                                              из того же алгола проросла симула, а из симулы проросло ОО в других языках.

                                                              системы типов а-ля ML (и уж тем более мощные системы типов а-ля Haskell) это вообще фрукты другого дерева.
                                                                0
                                                                Да да, расскажите мне, где это у типизации по Карри ноги из Паскаля растут. И что общего между алгоритмом Хиндли-Милнера и Паскалем.
                                                              +1
                                                              Haskell, OCaml, Scala, C# :-)
                                                            0
                                                            Давно уже есть D, так же известный как Dолгострой. :)
                                                              0
                                                              Честно говоря, D меня как-то особо не зацепил, а вот Go — наоборот, поэтому я даже рискнул написать статью об этом языке сюда, хотя прошло совсем немного времени с того момента, как я попробовал написать что-нибудь на этом языке
                                                              0
                                                              Есть язык D
                                                              0
                                                              Спасибо, интересно было почитать, а были бы хоть какие-нибудь маленькие примеры кода — было бы вообще замечательно.
                                                                0
                                                                Лучших примеров кода, чем в туториале (ссылка на который приведена во втором абзаце), мне лично сложно придумать. А копи-паст я сам очень не люблю, поэтому в статье примеров кода тоже нет :)
                                                                  0
                                                                  Ваше дело конечно, но для наглядности можно было бы и копипаст сделать с небольшим объяснением происходящего:) Не все же полезут в мануал.
                                                                0
                                                                Go — это первый язык со статической типизацией, который я видел, где она не очень мешает программировать и не заставляет писать в 2-3 раза больше кода, чем на PHP или Javascript.
                                                                Scala?
                                                                  0
                                                                  Скажу честно — не смотрел, ибо JVM.
                                                                    0
                                                                    Ну, например, смотрите (код приводится в пример в Introduction к Scala):

                                                                    Scala:
                                                                    private val CMD_ADD = 0
                                                                    private val CMD_REMOVE = 1
                                                                    private val CMD_ADDX = 2
                                                                    private val CMD_REMOVE_TENTATIVE = 3
                                                                    private val CMD_SAVE_XID = 4
                                                                    private val CMD_UNREMOVE = 5
                                                                    private val CMD_CONFIRM_REMOVE = 6
                                                                    private val CMD_ADD_XID = 7


                                                                    В Go, чтобы переменные или константы (в данном случае это должно быть константой) не были глобальными, их имя просто не должно начинаться с большой буквы. Итак, тот же код на Go (я добавил подчеркивание в начале):
                                                                    const
                                                                    (
                                                                    _CMD_ADD = iota
                                                                    _CMD_REMOVE
                                                                    _CMD_ADDX
                                                                    _CMD_REMOVE_TENTATIVE
                                                                    _CMD_SAVE_XID
                                                                    _CMD_UNREMOVE
                                                                    _CMD_CONFIRM_REMOVE
                                                                    _CMD_ADD_XID
                                                                    )


                                                                    Хммм ;)
                                                                      0
                                                                      Разве это не тот же enum в c++ или делфи? Приведение в тип int перечисляемого типа дает число от 0 до N.
                                                                        0
                                                                        Да, если в таком простом случае, это тот же enum. А если написать вместо просто iota, скажем, iota*iota, то получим список квадратов чисел, вроде такого:

                                                                        const (
                                                                        _1_2 = iota*iota // 1
                                                                        _2_2 // 4
                                                                        _3_2 // 9
                                                                        _4_2 // 16
                                                                        // ...
                                                                        )


                                                                        Выражение с использованием iota может быть сколь угодно сложным, лишь бы оно было константным
                                                                        0
                                                                        Короче, ваша правда :)

                                                                        Но! Глобальные переменные — это ересь! Область жизни переменной не должна превышать одного экрана.
                                                                          0
                                                                          Для средне-больших проектов конечно. Для скриптов и глобальные хороши.
                                                                            0
                                                                            Мой пример — это объявление приватной константы, потому что имя константы не начинается с большой буквы (приватной по отношению к файлу).
                                                                              0
                                                                              Ваш пример супер. Я в общем о языке, что он поддерживает глобальные переменные.
                                                                                0
                                                                                К «глобальным переменным» из других файлов нужно обращаться, как имяпакета.ИмяКонстанты. В этом смысле, да, в Go есть глобальные переменные
                                                                              0
                                                                              >Но! Глобальные переменные — это ересь! Область жизни переменной не должна превышать одного экрана.

                                                                              Что считаем переменной — область памяти со значением или один из указателей на неё? Область жизни или область видимости? А как быть с теми значениями, которые действительно нужны везде, особенно в языках в которых фактически нет разницы между, например, целым числом и синглтон классом, или он тоже должен жить не более одного экрана? Или предлагаете какой-нибудь параметр, например, кодировку передавать по значению во все функции/методы?
                                                                            0
                                                                            Этот код с iota мне не нравится. Например, у меня есть мегабайты кода. Встретил я в них где-то _CMD_CONFIRM_REMOVE. Кликнул по ней с Ctrl, перешёл на определение. И мне надо высчитывать чему она равна в уме? Это замедляет работу.
                                                                              0
                                                                              А если какой-нибудь умник вставит константу между остальных, мои сериализованные объекты больше не десериализуются :(
                                                                                0
                                                                                Нормальная IDE просто должна показывать численное значение.
                                                                                0
                                                                                Сдаётся мне, что тут дело не в типизации
                                                                                0
                                                                                Да банально C#. Всё подряд он не выводит, как та же Скала, но даже и с его простеньким выводом типов пишется довольно-таки легко и ненавязчиво. Ну или, например, JavaFX script (жаль только там нет поддержки generics).
                                                                                –7
                                                                                > Язык Go с точки зрения PHP-разработчика
                                                                                Pascal с точки зрения программиста на Basic…
                                                                                Изобразительное искусство с точки зрения маляра…
                                                                                Нейрохирургия с точки зрения дентиста…
                                                                                  +2
                                                                                  еда с точки зрения тролля?)
                                                                                  0
                                                                                  > мне хотелось увидеть какой-нибудь язык, который бы принципиально чем-то отличался от PHP, но при этом был пригоден для веба

                                                                                  Наверное меня закидают камнями, но ещё пригоден для веба Python и Ruby. Сам писал на PHP 3 года, после знакомства с Python, хочется писать только на нём.

                                                                                  P.S. После краткого знакомства с Ruby, уже лень и на Python писать, но производительность в некоторых моментах, отстутствие опыта не дает перейти.
                                                                                    0
                                                                                    Наверное пригодны эти языки, раз на них тоже часто для веба пишут :). Я просто ни на Ruby ни на Питоне особо не писал, поэтому и в топике про них мало идет речи

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

                                                                                  Самое читаемое