Что значит в golang
Перейти к содержимому

Что значит в golang

  • автор:

Введение в язык Go

Go представляет компилируемый статически типизированный язык программирования от компании Google. Язык Go предназначен для создания различного рода приложений, но прежде всего это веб-сервисы и клиент-серверные приложения. Хотя также язык обладает возможностями по работе с графикой, низкоуровневыми возможностями и т.д.

Работа над языком Go началась в 2007 в недрах компании Google. Одним из авторов является Кен Томпсон, который, к слову, является и одним из авторов языка Си (наряду с Денисом Ритчи). 10 ноября 2009 года язык был анонсирован, а в марте 2012 года вышла версия 1.0. При этом язык продолжает развиваться. Текущей версией на момент написания данной статьи является версия 1.20, которая вышла в феврале 2023 года.

Язык Go развивается как open source, то есть представляет поект с открытым исходным кодом, и все его коды и компилятор можно найти и использовать бесплатно. Официальный сайт проекта — https://go.dev/, где можно много полезной информации о языке.

Go является кроссплатформенным, он позволяет создавать программы под различные операционные системы — Windows, Mac OS, Linux, FreeBSD. Код обладает переносимостью: программы, написанные для одной из этих операционных систем, могут быть легко с перекомпиляцией перенесены на другую ОС.

Основные особенности языка Go:

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

В настоящее время Go находит широкое применение в различных сферах. В частности, среди известных проектов, которые применяют Go, можно найти следующие: Google, Dropbox, Netflix, Kubernetes, Docker, Twitch, Uber, CloudFlare и ряд других.

Что нужно для работы с Go? Прежде всего необходим текстовый редактор для набора кода и компилятор для преобразования кода в исполняемый файл. Также можно использовать специальные интегрированные среды разработки (IDE), которые поддерживают Go, например, GoLand от компании JetBrains. Существуют плагины для Go для других IDE, в частности, IntelliJ IDEA и Netbeans.

Установка компилятора

Пакет для установки компилятора можно загрузить с официального сайта https://go.dev/dl/.

Установка компилятора для языка программирования Go

По этому адресу пакеты установщиков для различных операционных систем. Так, при загрузки и запуске установщика для Windows открывается следующее окно:

Установка компилятора Go на Windows

После принятия лицензионного соглашения отобразится окно для выбора места установки:

Путь к компилятору Go на Windows

На Windows, например, по умолчанию используется путь «C:\Program Files\Go\». Оставим путь по умолчанию и перейдем к следующему окну, на котором нажмем на кнопку Install:

Установка компилятора Go на Windows

После успешной установки в папке установки будут установлены все файлы, необходимые для работы с Go. В частности, в подкаталоге bin можно найти файл go (go.exe на Windows), который выполняет роль компилятора:

Компилятор GoLang

После установки мы можем проверить версию языка, запустив следующую команду в консоли/командной строке:

Язык программирования Go: почему все его любят и что на нем можно писать

Язык программирования Go: почему все его любят и что на нем можно писать главное изображение

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

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

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

Go разрабатывался как опен-сорс проект и публично вышел в 2012 году. За 10 лет он стал одним из самых популярных языков программирования: в 2022 году он находится на шестом месте по популярности среди языков программирования, которые используются на GitHub, обогнав PHP, C, C#, Ruby и Swift.

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Для чего используется Go

Изначально Go создавался для программ, связанных с сетями и инфраструктурой, в качестве замены популярных высокопроизводительных серверных языков, таких как Java и C++. Сегодня же Go используется как бэкенд-язык для огромного количества различных направлений разработки:

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

Однако лучше всего Go раскрывается как язык программирования для работы с инфраструктурой. Самые популярные инструменты в этой области написаны именно на Go — Kubernetes, Docker и Prometheus.

Почему разработчики любят Go

Простота языка

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

package main import "fmt" func main()  fmt.Println("Hello, World!") > 

Высокопроизводительные приложения

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

Кроме того, Go отлично работает с инфраструктурой и облачными платформами. Его используют в качестве основного языка Amazon Web Services, Microsoft Azure и Google Cloud Platform (GCP).

Комьюнити и зарплаты

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

Про зарплаты: у Go-разработчиков вторая на IT-рынке зарплата в США, она превышает $140 тыс. в год. Однако стоит отметить, что такой перекос в зарплатах у Go-разработчиках на американском рынке может быть связан с тем, что большинство из них работают в Google, где традиционно программисты получали большую зарплату.

По результатам опроса сервиса Stack Overflow за 2021 год, Go разработчики зарабатывают за год в среднем в мире $75 тыс. в год — это делает язык восьмым по прибыльности из всех существующих. Это больше, чем Python-разработчики ($59 тыс. в год), JS-разработчики ($54 тыс. в год), Java-разработчики ($51 тыс. в год) и PHP-разработчикам ($38 тыс. в год). Вероятно, такая зарплата связана с опытом Go-разработчиков, в него редко идут джуниорами и практически не учат в качестве первого языка программирования.

На сайте HeadHunter на конец лета 2022 года было 2 641 вакансия с упоминанием языка программирования Go. Зарплаты начинаются от 80 тыс. рублей, при этом есть 40 вакансий, по которым платят более 600 тыс. рублей в месяц.

В вакансиях в связке с Go часто требуются технологии:

«Go — идеальное карьерное развитие для PHP-разработчиков»: преподаватель Хекслета Влад Гукасов — про Go-разработчиков

Преподаватель Хекслета Go Влад Гукасов рассказывает, зачем PHP-разработчики переходят на Go, почему языку практически не нужны фреймворки и какие у Go есть уникальные IT-концепции.

Меня зовут Влад Гукасов, я работаю бэкендером в международной финтех-компании Space307. Основной язык на бэкенде в нашей компании — Go.

До этого я писал на PHP, но в определенный момент появилась задача, где идеально подходил именно Go. Мы реализовывали сервис для веб-сокетов — это микросервис, поэтому PHP для этой задачи плохо подходит, зато Golang — отлично. Так я познакомился с Go, делал рабочие фичи и параллельно проходил курсы на разных платформах. Потом я поменял работу, и новую искал уже с упором на Go — теперь я поддерживаю легаси на PHP, и пишу новый код на Golang.

Вообще, Go — идеальное карьерное продолжение для PHP-разработчика. Многие программисты используют эти два языка в синергии, потому что все большие старые проекты в России написаны на PHP — «ВКонтакте», «Авито», у VK много проектов на нем. Но нагрузка постепенно растет, спектр задач расширяется, поэтому компании переходят на более эффективные и современные технологии.

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

Плюсы Go

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

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

Третий плюс: весь проект и вся кодовая база собирается в один бинарный файл. Это значит, что можно писать один код, который потом легко компилировать под любую платформу и архитектуру процессора — под Windows или Linux. Этим часто пользуются в DevOps, когда надо написать скрипты и скомпилировать их под каждое железо. И делается это просто одной строкой.

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

Go как второй язык

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

Чаще всего Go используют в качестве второго языка разработки. Поэтому люди, которые с ним работают, сразу видят его простоту и логичность. Например, по сравнению с Node.JS в Go весь код по умолчанию синхронен, пока ты сам не скажешь, что нужно делать по-другому. Еще в Go сложно выстрелить себе в ногу и наделать ошибок, связанных с типами данных: потому что язык не динамический, а компилируемый со статической типизацией.

Почему в Go не нужны фреймворки

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

Допустим, разработчику нужно сделать обычный бэкенд веб-сервер, который будет обрабатывать какие-то самые простые запросы. На Ruby on Rails или PHP мы для этого работаем через фреймворк (в PHP сначала надо поднять Nginx — прокси, потому что PHP не может самостоятельно обрабатывать запрос).

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

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

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Go (Golang)

Go (Golang) — это компилируемый многопоточный язык программирования от Google с открытым исходным кодом. Считается языком общего назначения, но основное применение — разработка веб-сервисов и клиент-серверных приложений. По данным GitHub, к концу 2023 года стал шестым по востребованности языков, опередив PHP, C и C#.

«IT-специалист с нуля» наш лучший курс для старта в IT

Как появился Golang

Язык Go был представлен в 2009 году в корпорации Google. Его полное название — Golang — производное от «Google language». Язык создали Роб Пайк и Кен Томпсон. Они работали в лаборатории Bell Labs, выпустившей операционную систему UNIX и языки программирования C и C++, транзистор, лазер, кварцевые часы.

Цель проекта — создать современную альтернативу C и C++ и сделать разработку ПО в Google более быстрой.

Профессия / 8 месяцев
IT-специалист с нуля

Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

vsrat_7 1 (1)

Язык должен был решить такие проблемы, как:

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

В основе языка Golang — база лучших функций из языков C и C++, Python, Pascal, Oberon и Modula. Сначала Go использовали внутри Google, но затем он стал применяться в компаниях по всему миру: HP, Adobe, Microsoft, Facebook, BBC, Uber, Dropbox, Netflix, Яндекс, ВКонтакте, Avito, Ozon и других.

маскот языка Go

Особенности языка Golang

Компилируемость

Исходный код преобразуется в машинный с помощью компилятора. Официальный компилятор Golang работает в UNIX-подобных операционных системах, включая macOS, а также в Linux и Windows. Среди мобильных ОС компилятор Go поддерживает Android. Существуют также независимые компиляторы, созданные сторонними разработчиками.

Многопоточность

Поддержка нескольких потоков по умолчанию упрощает написание кода для мощных приложений. Для этого в языке программирования Go есть горутины и каналы.

Горутины — параллельные операции, которые могут выполняться независимо от функции, в которой запущены. Как правило, горутины представляют вызов функции и последовательно выполняют свои инструкции. Во время запуска программы на Go мы уже работаем как минимум с одной горутиной. Она представлена функцией main и последовательно выполняет инструкции, определенные внутри нее. Чтобы создать горутину, нужно написать перед ней go.

схема работы горутин в Golang

Если какие-то горутины завершились раньше функции main, можно увидеть на консоли результат выполнения. Но независимо от количества горутин главной является вызов функции main. Если ее выполнение завершается, то завершается выполнение всей программы.

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

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

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

Строгая статическая типизация

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

Понятный и простой синтаксис

Нет объектов, классов и наследования, которые усложняют код и его изменения. Он доступен новичкам и прост в изучении. Официальное руководство Go занимает всего 50 страниц, просто читается и содержит примеры.

Также упрощенный синтаксис позволяет быстро прочитать чужой код — слева направо. Стандарты, обозначения или комментарии не требуются. Это важно в командной работе.

package main import «fmt» func main()

Инструменты для разработчиков

В Go есть инструменты, которые ускоряют разработку и помогают решать разные задачи:

  • typecheckпроверит соответствие типов в коде;
  • gasнайдет уязвимости;
  • go vetпоможет обнаружить ошибки в коде;
  • gofmtправильно отформатирует код, проставит пробелы для выравнивания и табы для отступа;
  • godoc найдет комментарии и подготовит из них мануал к программе, и другие.

Также в Go от Google есть пакет pprof. Он позволяет узнать, какие фрагменты кода выполняются очень долго, где программа сильно нагружает процессор или занимает много памяти. Результат работы представлен в виде текстового отчета, профайла. Для его использования нужна утилита graphviz.

Наличие «сборщика мусора»

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

Кроссплатформенность

Язык от Google поддерживается на Windows, Linux, macOS, Android. Также он работает с FreeBSD, OpenBSD и другими UNIX-системами. Код также обладает переносимостью: программы, написанные для одной из этих операционных систем, могут быть легко с перекомпиляцией перенесены на другую ОС.

Нехватка конструкций для ООП

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

Полная поддержка Unicode

Кодировка символов Unicode — самая полная из существующих, в нее входят практически все знаки и буквы, которые есть в мире. Многие языки требуют подключать поддержку этой кодировки отдельно, но в Go строковые данные по умолчанию представлены в Unicode.

Как установить и начать использовать Go

Скачать библиотеки, компилятор, инструменты для языка программирования Golang для разных платформ можно на официальном сайте: представлены сборки для Windows, Linux, MacOS. Также можно скомпилировать исходные файлы на операционных системах OpenBSD, FreeBSD, DragonFly BSD, Android, Solaris и других.

Для написания кода можно использовать:

  • текстовый редактор с автодополнением, подсветкой синтаксиса Go, компиляцией и отладкой — например, в Vim, Notepad++, Emacs;
  • универсальную среду разработки (IDE): NetBeans, Eclipse, IntelliJ, Zeus, Codebox IDE, Komodo,Visual Studio и другие;
  • специализированную среду разработки для Golang. Например, GoLand или LiteIDE.

Go подходит начинающим разработчикам в качестве первого языка. Он простой, защищает от ошибок и дает подсказки. При этом Golang – мощный и очень востребованный язык, который поддерживает Google.

IT-специалист с нуля

Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.

картинка (75)

Статьи по теме:
Эксперты рассказывают о том, как искали работу и сотрудников после начала кризиса

Почему для больших проектов обычно выбирают Java, средних — PHP, а быстро развивающихся стартапов — Ruby или Go

Язык Go для начинающих

Gopher

Цель этой статьи — рассказать о языке программирования Go (Golang) тем разработчикам, которые смотрят в сторону этого языка, но еще не решились взяться за его изучение. Рассказ будет вестись на примере реального приложения, которое представляет из себя RESTful API веб-сервис.

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

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

Основные преимущества языка Go:

  • Простой и понятный синтаксис. Это делает написание кода приятным занятием.
  • Статическая типизация. Позволяет избежать ошибок, допущенных по невнимательности, упрощает чтение и понимание кода, делает код однозначным.
  • Скорость и компиляция. Скорость у Go в десятки раз быстрее, чем у скриптовых языков, при меньшем потреблении памяти. При этом, компиляция практически мгновенна. Весь проект компилируется в один бинарный файл, без зависимостей. Как говорится, «просто добавь воды». И вам не надо заботиться о памяти, есть сборщик мусора.
  • Отход от ООП. В языке нет классов, но есть структуры данных с методами. Наследование заменяется механизмом встраивания. Существуют интерфейсы, которые не нужно явно имплементировать, а лишь достаточно реализовать методы интерфейса.
  • Параллелизм. Параллельные вычисления в языке делаются просто, изящно и без головной боли. Горутины (что-то типа потоков) легковесны, потребляют мало памяти.
  • Богатая стандартная библиотека. В языке есть все необходимое для веб-разработки и не только. Количество сторонних библиотек постоянно растет. Кроме того, есть возможность использовать библиотеки C и C++.
  • Возможность писать в функциональном стиле. В языке есть замыкания (closures) и анонимные функции. Функции являются объектами первого порядка, их можно передавать в качестве аргументов и использовать в качестве типов данных.
  • Авторитетные отцы-основатели и сильное комьюнити. Роб Пайк, Кен Томпсон, Роберт Гризмер стояли у истоков. Сейчас у языка более 300 контрибьюторов. Язык имеет сильное сообщество и постоянно развивается.
  • Open Source
  • Обаятельный талисман

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

Итак, вернемся к нашей задаче. Хоть язык и не накладывает ограничений на структуру проекта, данное приложение я решил организовать по модели MVC. Правда View реализовывается на стороне клиента. В моем случае это был AngularJS, в перспективе — нативное мобильное приложение. Здесь я расскажу лишь об API на стороне сервиса.

Структура проекта получилась следующая:

/project/ /conf/ errors.go settings.go /controllers/ posts.go users.go /models/ posts.go users.go /utils/ helpers.go loctalk.go 

Программа в Go разделяется на пакеты (package), что указывается в начале каждого файла. Имя пакета должно соответствовать директории в которой находятся файлы, входящие в пакет. Так же, должен быть главный пакет main с функцией main(). Он у меня находится в корневом файле приложения loctalk.go. Таким образом, у меня получилось 5 пакетов: conf, controllers, models, utils, main.
Буду приводить неполное содержание файлов, а только минимально необходимое для понимания.

Пакет conf содержит константы и настройки сайта.

package conf import ( "os" ) const ( SITE_NAME string = "LocTalk" DEFAULT_LIMIT int = 10 MAX_LIMIT int = 1000 MAX_POST_CHARS int = 1000 ) func init() < mode := os.Getenv("MARTINI_ENV") switch mode < case "production": SiteUrl = "http://loctalk.net" AbsolutePath = "/path/to/project/" default: SiteUrl = "http://127.0.0.1" AbsolutePath = "/path/to/project/" >> 

Думаю, комментировать тут нечего. Функция init() вызывается в каждом пакете до вызова main(). Их может быть несколько в разных файлах.

package main import ( "github.com/go-martini/martini" "net/http" "loctalk/conf" "loctalk/controllers" "loctalk/models" "loctalk/utils" ) func main() < m := martini.Classic() m.Use(func(w http.ResponseWriter) < w.Header().Set("Content-Type", "application/json; charset=utf-8") >) m.Map(new(utils.MarshUnmarsh)) Auth := func(mu *utils.MarshUnmarsh, req *http.Request, rw http.ResponseWriter) < reqUserId := req.Header.Get("X-Auth-User") reqToken := req.Header.Get("X-Auth-Token") if !models.CheckToken(reqUserId, reqToken) < rw.WriteHeader(http.StatusUnauthorized) rw.Write(mu.Marshal(conf.ErrUserAccessDenied)) >> // ROUTES m.Get("/", controllers.Home) // users m.Get("/api/v1/users", controllers.GetUsers) m.Get("/api/v1/users/:id", controllers.GetUserById) m.Post("/api/v1/users", controllers.CreateUser) // … // posts m.Get("/api/v1/posts", controllers.GetRootPosts) m.Get("/api/v1/posts/:id", controllers.GetPostById) m.Post("/api/v1/posts", Auth, controllers.CreatePost) // . m.Run() > 

В самом верху определяется имя пакета. Далее идет список импортируемых пакетов. Мы будем использовать пакет Martini. Он добавляет легкую прослойку для быстрого и удобного создания веб-приложений. Обратите внимание как импортируется этот пакет. Нужно указать путь к репозиторию откуда он был взят. А чтобы его получить, достаточно в консоли набрать команду go get github.com/go-martini/martini

Далее мы создаем экземпляр Martini, настраиваем и запускаем его. Обратите внимание на знак « := ». Это сокращенный синтаксис, он означает: создать переменную соответствующего типа и инициализировать ее. Например, написав a := «hello», мы создадим переменную a типа string и присвоим ей строку «hello».

Переменная m в нашем случае имеет тип *ClassicMartini, именно это возвращает martini.Classic(). * означает указатель, т. е. передается не само значение, а лишь указатель на него. В метод m.Use() мы передаем функцию-обработчик. Этот Middleware позволяет Martini делать определенные действия над каждым запросом. В данном случае, мы определяем Content-Type для каждого запроса. Метод m.Map() же позволяет привязать нашу структуру и использовать ее затем в контроллерах при необходимости (механизм dependency injection). В данном случае, я создал обертку для кодирования структуры данных в формат json.

Тут же мы создаем внутреннюю функцию Auth, которая проверяет авторизацию пользователя. Ее можно вставить в наши роуты и она будет вызываться до вызова контроллера. Эти вещи возможны благодаря Martini. С использованием стандартной библиотеки код получился бы немного другой.

Взглянем на файл errors.go пакета conf.

package conf import ( "fmt" "net/http" ) type ApiError struct < Code int `json:"errorCode"` HttpCode int `json:"-"` Message string `json:"errorMsg"` Info string `json:"errorInfo"` >func (e *ApiError) Error() string < return e.Message >func NewApiError(err error) *ApiError < return &ApiError> var ErrUserPassEmpty = &ApiError var ErrUserNotFound = &ApiError var ErrUserIdEmpty = &ApiError var ErrUserIdWrong = &ApiError // … и т. д. 

Язык поддерживает возврат нескольких значений. Вместо механизма try-catch, очень часто используется прием, когда вторым аргументом возвращается ошибка. И при ее наличии, она обрабатывается. Есть встроенный тип error, который представляет из себя интерфейс:

type error interface

Таким образом, чтобы реализовать этот интерфейс, достаточно иметь метод Error() string. Я создал свой тип для ошибок ApiError, который более специфичен для моих задач, однако совместим со встроенным типом error.

Обратите внимание на — type ApiError struct. Это определение структуры, модели данных, которую вы будете использовать постоянно в своей работе. Она состоит из полей определенных типов (надеюсь, вы успели заметить, что тип данных пишется после имени переменной). Кстати, полями могут быть другие структуры, наследуя все методы и поля. В одинарных кавычках « указаны теги. Их указывать не обязательно. В данном случае они используются пакетом encoding/json для указания имени в выводе json (знак минус «-» вообще исключает поле из вывода).

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

Двигаемся дальше. Определение func (e *ApiError) Error() string означает ни что иное, как метод данной структуры. Переменная e — это указатель на структуру, своего рода self/this. Соответственно вызвав метод .Error() на структуре, мы получим ее поле Message.

Далее мы определяем предустановленные ошибки и заполняем их поля. Поля вида http.StatusBadRequest — это значения типа int в пакете http для стандартных кодов ответа, своего рода алиасы. Мы используем сокращенный синтаксис объявления структуры &ApiError<> с инициализацией. По другому можно было бы написать так:

MyError := new(ApiError) MyError.Code = 110 // … 

Символ & означает получить указатель на данную структуру. Оператор new() так же возвращает указатель, а не значение. По-началу возникает небольшая путаница с указателями, но, со временем, вы привыкните.

Перейдем к нашим моделям. Приведу урезанную версию модели постов:

package models import ( "labix.org/v2/mgo/bson" "loctalk/conf" "loctalk/utils" "time" "unicode/utf8" "log" ) // GeoJSON format type Geo struct < Type string `json:"-"` Coordinates [2]float64 `json:"coordinates"` >type Post struct < Id bson.ObjectId `json:"id" bson:"_id,omitempty"` UserId bson.ObjectId `json:"userId"` UserName string `json:"userName"` ThumbUrl string `json:"thumbUrl"` ParentId bson.ObjectId `json:"parentId,omitempty" bson:",omitempty"` Enabled bool `json:"-"` Body string `json:"body"` Geo Geo `json:"geo"` Date time.Time `json:"date" bson:",omitempty"` >func NewPost() *Post < return new(Post) >func (p *Post) LoadById(id string) *conf.ApiError < if !bson.IsObjectIdHex(id) < return conf.ErrPostIdWrong >session := utils.NewDbSession() defer session.Close() c := session.Col("posts") err := c.Find(bson.M).One(p) if p.Id == "" < return conf.ErrPostNotFound >if err != nil < return conf.NewApiError(err) >return nil > func (p *Post) Create() (id string, err *conf.ApiError) < // validation switch < case p.UserId == "": err = conf.ErrUserIdEmpty case p.Body == "": err = conf.ErrPostBodyEmpty case utf8.RuneCountInString(p.Body) >conf.MAX_POST_CHARS: err = conf.ErrPostMaxSize case p.Geo.Coordinates[0] == 0.0 || p.Geo.Coordinates[1] == 0.0: err = conf.ErrPostLocationEmpty > if err != nil < return >p.Id = bson.NewObjectId() p.Geo.Type = "Point" p.Enabled = true p.Date = time.Now() session := utils.NewDbSession() defer session.Close() c := session.Col("posts") errDb := c.Insert(p) if errDb != nil < return "", conf.NewApiError(errDb) >return p.Id.Hex(), nil > func (p *Post) Update() *conf.ApiError < session := utils.NewDbSession() defer session.Close() c := session.Col("posts") err := c.UpdateId(p.Id, p) if err != nil < return conf.NewApiError(err) >return nil > func (p *Post) Disable() *conf.ApiError < session := utils.NewDbSession() defer session.Close() p.Enabled = false c := session.Col("posts") err := c.UpdateId(p.Id, p) if err != nil < return conf.NewApiError(err) >return nil > // … 

Здесь мы используем замечательный драйвер для MongoDb — mgo, чтобы сохранять данные. Для удобства, я создал небольшую обертку над api mgo — utils.NewDbSession. Логика работы с данными: сначала мы создаем объект во внутренней структуре языка, а затем, с помощью метода этой структуры, сохраняем его в базу данных.

Обратите внимание, что в этих методах мы везде используем наш тип ошибки conf.ApiError. Стандартные ошибки мы конвертируем в наши с помощью conf.NewApiError(err). Так же, важен оператор defer. Он исполняется в самом конце выполнения метода. В данном случае, закрывает соединение с БД.

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

package controllers import ( "encoding/json" "fmt" "github.com/go-martini/martini" "labix.org/v2/mgo/bson" "loctalk/conf" "loctalk/models" "loctalk/utils" "net/http" ) func GetPostById(mu *utils.MarshUnmarsh, params martini.Params) (int, []byte) < id := params["id"] post := models.NewPost() err := post.LoadById(id) if err != nil < return err.HttpCode, mu.Marshal(err) >return http.StatusOK, mu.Marshal(post) > // . 

Здесь мы получаем из URL id запрашиваемого поста, создаем новый экземпляр нашей структуры и вызываем на ней метод LoadById(id) для загрузки данных из БД и заполнения данной структуры. Которую мы и выводим в HTTP ответ, предварительно преобразовав в json нашим методом mu.Marshal(post).

Обратите внимание на сигнатуру функции:

func GetPostById(mu *utils.MarshUnmarsh, params martini.Params) (int, []byte) 

Входные параметры нам предоставляет Martini с помощью механизма внедрения зависимостей (dependency injection). И мы возвращаем два параметра (int, []byte) — число (статус ответа) и массив байт.

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

Для изучения могу порекомендовать хорошую книгу на русском «Программирование на языке Go» Марка Саммерфильда. И, конечно, больше практиковаться.

UPD: Tour Go на русском.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *