Как стать автором
Обновить

Разработка приложений на Go: повторное использование логики

Время на прочтение5 мин
Количество просмотров11K

На мой взгляд, написание библиотек на Go — довольно хорошо освещенная тема… а вот о написании приложений (команд) статей гораздо меньше. Когда дело до этого доходит, весь код на Go представляет собой команду. Так давайте об этом и поговорим! Этот пост будет первым в серии, т.к. у меня много информации, которой я еще не делился.


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

Читать дальше →
Всего голосов 23: ↑18 и ↓5+13
Комментарии16

Как не наступать на грабли в Go

Время на прочтение10 мин
Количество просмотров89K

Этот пост является версией моей же англоязычной статьи "How to avoid gotchas in Go", но слово gotcha не переводится на русский, поэтому я буду использовать это слово как без перевода, так и немного непрямой вариант — "наступать на грабли".


Gotcha — корректная конструкция системы, программы или языка программирования, которая работает, как описано, но, при этом, контринтуитивна и является причиной ошибок, поскольку её легко использовать неверно.

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


Но один вопрос меня мучал долгое время — почему я сам никогда не делал этих ошибок? Серьезно, самые популярные из них, вроде путаницы с nil-интерфейсом или непонятного результата при append()-е слайса — в моей практике никогда не были проблемой. Каким-то образом мне повезло обойти эти подводные камни с первых дней своей работы с Go. Что же мне помогло?


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

Читать дальше →
Всего голосов 46: ↑38 и ↓8+30
Комментарии9

Облегчаем реверсинг Golang бинарников или зачем вообще писать скрипты в IDA

Время на прочтение4 мин
Количество просмотров18K
Golang — отличный язык. Строгая типизация, сборщик мусора, вызов си функций через cgo, reflect, chan — просто сказка! Очевидно что так считаю не только я, т.к. go популярен, а значит его использует много программистов, а значит есть высокая вероятность что когда-то кому-то понадобится реверсить его бинарники — этим мы сейчас и займемся.
Читать дальше →
Всего голосов 39: ↑36 и ↓3+33
Комментарии6

Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux

Время на прочтение6 мин
Количество просмотров20K
Перед вами второй материал из серии статей, посвящённой разработке REST-серверов на Go. В первом материале этой серии мы создали простой сервер, пользуясь стандартными средствами Go, а после этого отрефакторили код формирования JSON-данных, вынеся его во вспомогательную функцию. Это позволило нам выйти на достаточно компактный код обработчиков маршрутов.


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



Это — проблема, с которой сталкиваются все, кто пишет HTTP-сервера, не используя зависимости. Если только сервер, принимая во внимание систему его маршрутов, не является до крайности минималистичной конструкцией (например — это некоторые специализированные серверы, имеющие лишь один-два маршрута), то оказывается, что размеры и сложность организации кода маршрутизатора — это нечто такое, на что очень быстро обращают внимание опытные программисты.
Читать дальше →
Всего голосов 39: ↑35 и ↓4+31
Комментарии0

Опрос разработчиков от StackOverflow (2017)

Время на прочтение3 мин
Количество просмотров34K

В конце марта вышел очередной мега-опрос разработчиков от StackOverflow, в котором приняли участие десятки тысяч человек. Ссылка на результаты опроса здесь. Отчет получился внушительным по размеру, поэтому давайте просто рассмотрим некоторые интересные моменты из него.


Кстати, на КДПВ — список "Most Loved" языков, это языки, на которых опрашиваемые пробовали писать, и им понравилось.


Читать дальше →
Всего голосов 62: ↑55 и ↓7+48
Комментарии104

Мета-инструмент разработки: FutoIn CID

Время на прочтение8 мин
Количество просмотров4K

use cases


Сейчас мало кого удивишь инструментами управления зависимостями проекта вроде npm, composer, bundler, pip, maven, cargo и других. Их общий недостаток — невозможность управлять непосредственно средой выполнения. Такая задача решается через nvm, php-build, rvm, virtualenv, sdkman, rustup и прочие глобальные "манагеры" версий runtime, обычно написанные под Bash/Zsh.


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


Далее разброд и шатание настегает Continuous Integration & Delivery, где ручные танцы с бубном установки инструментов и активирования конкретных версий совершенно не приветствуются, а в идеале требуется в принципе максимально абстрагироваться от используемых технологий и довести процесс до примитивных нейтральных команд: подготовить к релизу, затегить, скачать, подготовить, построить, упаковать, выложить, проверить, одобрить(подписать), выкатить.


Тут сам собой напрашивается инструмент, унифицировано работающий поверх уже существующих технологий,
который из себя и представляет FutoIn CID — FutoIn Continuous Integration & Delivery tool.

Читать дальше →
Всего голосов 6: ↑6 и ↓0+6
Комментарии3

Чиним проблемы нагрузок в Go с помощью настройки пула HTTP-соединений

Время на прочтение5 мин
Количество просмотров11K

- Ребята, кажется, вы таймаутите. Вот трейс, на котором видно, что мы не дождались от вас ответа за 2 секунды. 

- Ничего подобного, у нас все норм — мы за 200 миллисекунд отвечаем в 99% запросов. А вот вы по какой-то причине часто преждевременно обрываете соединение. 

Такой разговор однажды произошёл у нас в Ozon между моей командой личного кабинета продавца и коллегами, которые пишут сервис аутентификации. Причина проблемы оказалась в дефолтных настройках Go для пула HTTP-соединений. Как так вышло, как мы обнаружили проблему и как исправлять подобные ситуации в микросервисах на Go – об этом моя сегодняшняя история. 

Так что же там было?
Всего голосов 24: ↑18 и ↓6+12
Комментарии15

Вызов кода Go из Dart с использованием cgo и Dart FFI на простом примере

Время на прочтение4 мин
Количество просмотров3.1K

Ключевой мотивацией для написания данной статьи является факт сильного недостатка информации (особенно в русскоязычном сообществе) по использованию cgo и Dart FFI для использования Go из языка Dart.

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

В случае если можно можно избежать экспорта go кода в Dart, то лучше воспользоваться такой возможностью, однако могут возникать случаи, когда использование уже написанного на go кода - является оптимальным решением (например вы уже знакомы с Go и Dart, и не хотите писать код на C, в таком случае есть смысл задуматься об использованием cgo и Dart FFI).

В данной статье на простом примере будет показано как можно повторно использовать код написанный на Go в языке Dart (например в приложениях на Flutter).

Что должно быть установлено:

Читать далее
Всего голосов 9: ↑8 и ↓1+7
Комментарии8

Как мы ускорили наш DNS стек в 3 раза

Время на прочтение8 мин
Количество просмотров11K

Компании Cloudflare уже пошёл 6-й год и предоставление авторитативных DNS серверов было основной нашей инфраструктуры с самого начала. С тех пор мы выросли, став самым большим и быстрым поставщиком услуг DNS в Интернете, обслуживая около 100 000 сайтов из списка Alex top 1M sites, и более 6 миллионов DNS зон.


imageImg


На сегодняшний день наш сервис DNS отвечает около 1 миллиона запросов в секунду — не считая трафика во время атак — с помощью глобальной anycast сети. Разумеется, технологии, которые мы, будучи растущим стартапом, использовали для того, чтобы обслуживать сотни и тысячи зон несколько лет назад уже не справляются с миллионами, которые мы имеем сегодня. В прошлом году мы решили заменить два ключевых элемента в нашей DNS инфраструктуре: часть нашего DNS сервера, который отвечает на авторитативные запросы и систему, которая берёт пользовательские изменения и обновляет их на пограничных серверах по всему миру.

Читать дальше →
Всего голосов 22: ↑21 и ↓1+20
Комментарии3

Go дайджест. События, статьи, интересные проекты из мира Go (30 марта — 13 апреля 2017)

Время на прочтение2 мин
Количество просмотров9.3K
imageВсем привет!

Это третий выпуск дайджеста, посвящённого языку программирования Go (Golang), в этом году.

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

Читать дальше →
Всего голосов 27: ↑24 и ↓3+21
Комментарии19

Почему вам стоит изучить Go?

Время на прочтение7 мин
Количество просмотров99K
Всем привет! Представляю вашему вниманию мой перевод статьи (включая графики) Кевала Патела Why should you learn Go? Статья содержит много интересных фактов, которые, по моему мнению, будет полезно узнать новичкам в Go.

P.S.: Статья, как и большинство статей, на мой взгляд, отражает опыт и мнение автора, которое может не совпадать с вашим, и это нормально — сколько людей, столько и мнений.
Gophers

Изображение взято с ресурса kirael-art.deviantart.com/art/Go-lang-Mascot-458285682

“Go станет серверным языком будущего.” — Tobias Lütke, Shopify

За последние пару лет произошёл мощный рост нового языка программирования: Go, или Golang. Согласитесь, ничто так не может свести с ума разработчика, как новый язык программирования. Поэтому, я начал изучать Go 4-5 месяцев назад и вот что я могу сказать о том, почему вам стоит изучить этот новый язык.
Читать дальше →
Всего голосов 90: ↑47 и ↓43+4
Комментарии332

Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin

Время на прочтение7 мин
Количество просмотров27K
Сегодня, в третьей части серии материалов, посвящённых разработке серверов на Go, мы займёмся реализацией нашего REST-сервера с использованием Gin — одного из самых популярных веб-фреймворков для Go. Вот код, который мы будем тут обсуждать.



Читать дальше →
Всего голосов 46: ↑43 и ↓3+40
Комментарии2

Кастование произвольного слайса, к слайсу интерфейсов

Время на прочтение1 мин
Количество просмотров2.8K

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


var  a = []int{1,2,3}
b = []interface(a)

Почему приходится писать вот так:


b := make([]interface{}, len(a))
for i:=0; i<len(a); i++ {
   b[i] = a[i]
}

Но, можно и по другому....

Читать дальше →
Всего голосов 23: ↑10 и ↓13-3
Комментарии5

slit — новое слово в мире PAGERов, либо как тратить меньше времени на просмотр логов

Время на прочтение5 мин
Количество просмотров8.6K
Так уж вышло, что мне регулярно приходится просматривать много логов. Одно радует, не так много как у людей работающих вместе со мной у которых порой это основная работа. Логи эти не лежат в в какой либо централизованной системе, а хранятся в s3 и смотрим мы их скачивая с перенаправлением вывода в less.

less установлен у всех, все привыкли с ним работать, знают о базовых вещах, как поиск вперед-назад, фильтрация по &, переход в конец(G) файла, переход в начало(g) и так далее.

А так же, все уже смирились с тем, что в любой момент, при добавлении фильтра less может подвиснуть на неопределенный срок, выводить по строчке в 5 секунд и так далее. В конечном счете, особенно при считывании логов с stdin — приходится быть аккуратным. Фильтр может сработать, а может и не сработать.

Собственно, в тот момент, что и мне выпала участь в течении нескольких дней пройтись через этак пару сотен лог-файлов — стало очевидно — мир нужно менять к лучшему…

Под катом демо (gif 2.2mb) и немного истории.
Читать дальше →
Всего голосов 28: ↑25 и ↓3+22
Комментарии42

Nalivator-9000: робот-бармен на Raspberry Pi и Go

Время на прочтение4 мин
Количество просмотров22K


Пару лет назад я наткнулся на проект Bartendro на Kickstarter. Мне понравилась идея, и я решил, что идеальное применение для моего недавно приобретенного Raspberry Pi найдено. Я прикинул какие детали понадобятся, и приступил к DIY реализации робота-бармена. Кратко расскажу что из этого получилось.
Всего голосов 40: ↑37 и ↓3+34
Комментарии36

Отчет с Go meetup 14 апреля

Время на прочтение2 мин
Количество просмотров7.9K


Спустя полгода сообщество Go-разработчиков снова воссоединилось в нашем московском офисе 14 апреля. И теперь у нас есть возможность ознакомиться с тем, как проходила эта встреча. Пять докладов и прочие подробности ищите под катом.
Всего голосов 40: ↑34 и ↓6+28
Комментарии3

Mein Konfig: экскурсия по dotfiles

Время на прочтение76 мин
Количество просмотров13K
Приветствую! Я люблю рассматривать чужие dotfiles и рассказы об устройстве рабочего места и окружения. Во-первых, любопытно как работают другие люди. Во-вторых, нередко находишь какой-нибудь полезный трюк или идею. А повышение продуктивности разработчика ПО часто идёт за счёт, казалось бы, мелочей (много кто помнит, что Ctrl-T посылает SIGINFO сигнал, показывающий прогресс копирования cp или dd?). Вот и решил рассказать про своё рабочее окружение, в том числе dotfiles. Перечислю список секций этой статьи, чтобы было примерное представление о чём пойдёт речь: Ввод, ОС, ФС, X11, MRA и MDA, Сеть, Jail, Демоны, MTA, MUA, WWW, PGP, IRC, st, tmux, cd, git, zsh, zsh completion, zsh history, ZLE, zsh prompt, zsh misc, less, grep, .zshenv, autoenv, .zprofile, t, Музыка, mpv, Картинки, Архивы, Feeds, Hjson, *tex*, File transfer, Games, БД, ЯП, Python, Go, C, redo, TAI64, Vim, tags, .vimrc, ~/.vim/pack, ~/.vim/plugin, ~/.vim/ftplugin. Безусловно будут спорные holywar высказывания, так что везде иметь в виду и добавлять фразу «по моему личному мнению».


Читать дальше →
Всего голосов 20: ↑19 и ↓1+18
Комментарии14

Mein Konfig: экскурсия по dotfiles (часть 2)

Время на прочтение71 мин
Количество просмотров5.7K
Статья-продолжение первой части, в которой не уместилось всё что хотел описать. Напомню, что в ней я начал описывать своё рабочее окружение и dotfiles.


Читать дальше →
Всего голосов 9: ↑8 и ↓1+7
Комментарии1

Как правильно писать логи (?)

Время на прочтение4 мин
Количество просмотров59K
Тема может и банальная, но когда программа начинает работать как то не так, и вообще вести себя очень странно, часто приходится читать логи. И много логов, особенно если нет возможности отлаживать программу и не получается воспроизвести ошибку. Наверно каждый выработал для себя какие то правила, что, как и когда логировать. Ниже я хочу рассмотреть несколько правил записи сообщений в лог, а также будет небольшое сравнение библиотек логирования для языков php, ruby и go. Сборщики логов и системы доставки не будут рассматриваться сознательно (их обсуждали уже много раз).
Читать дальше →
Всего голосов 25: ↑20 и ↓5+15
Комментарии24

Лекции Техносферы: Программирование на Go

Время на прочтение2 мин
Количество просмотров53K

image


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


Список лекций:


Всего голосов 73: ↑68 и ↓5+63
Комментарии52