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

Содержание:

Обработка 1 миллиона запросов в минуту c Go

Перевод

Предлагаю читателям «Хабрахабра» перевод статьи главного архитектора компании Malwarebytes о том, как они достигли обработки 1 миллиона запросов в минуту всего на 4 серверах.
У нас в Malwarebytes мы переживаем бешеный рост и с тех пор, как я присоединился к компании около года назад в Кремниевой Долине, одной из моих основных обязанностей было проектирование и разработка архитектур нескольких систем для развития быстрорастущей компании и всей необходимой инфраструктуры для поддержки продукта, который используют миллионы людей каждый день. Я работал в индустрии антивирусов более 12 лет в нескольких разных компаниях, и знаю, насколько сложными получаются в итоге эти системы, из-за колоссальных объемов данных, с которыми приходится иметь дело ежедневно.

Я перехожу на JavaScript

Перевод

После того, как я 5 лет писал на Go, я решил, что мне пора двигаться дальше. Go хорошо послужил мне. Вероятно, это был лучший язык, которым я мог бы пользоваться столько времени, но теперь настал момент оставить Go.
Не могу сказать, что я насмотрелся на ограничения и проблемы Go. За годы работы не случилось ничего такого, что подтолкнуло бы меня к переходу на язык, лучше соответствующий требованиям завтрашнего дня, или на язык, вокруг которого сложилось более успешное сообщество.
Мне не хотелось бы писать материал о том, почему я перешёл с Go на JavaScript, перечисляя минусы Go. Я полагаю, что подобные материалы оторваны от жизни и приносят читателям очень мало пользы. Поэтому я написал материал о том, что мне нравится в JavaScript, о том, что подвигло меня на переход.

Визуализация NFS-трафика с помощью elasticsearch+kibana

Tutorial

По долгу службы, мне часто приходится анализировать NFS-трафик. Wireshark является моим основным инструментом и для него я даже создавал расширение на lua. Но чего-то не хватало. И вот две недели назад я наткнулся на новый для меня инструмент Packetbeat. К сожалению, paketbeat не поддерживает не поддерживал NFS, но этот недостаток мне удалось исправить.

Packetbeat

Paketbeat — это один из инструментов из комплекта beats от создателей elasticsearch, logstash и kibana. Это отправитель (shipper) данных в elasticsearch, который слушает сетевой трафик, конвертирует его в json-записи и посылает в elasticsearch. Если вы используете Kibana4, то есть стандартные панели для визуализации собранного трафика. На данный момент, packetbeat распознаёт TCP, UDP, DNS, ICMP, HTTP, memcache, MongoDB, redis, PostgreSQL, MySQL, thrift и, теперь уже, NFS. Где-то внутри, packetbeat использует libpcap.

Синтаксис

Пакеты

Каждая программа на языке Go состоит из пакетов (packages). Пакет — главный, с него начинается выполнение программы. В приведённом выше примере импортируется пакет .

Импорт пакетов можно описать двумя способами.

Так:

или так:

Функции

Общая форма определения функции выглядит следующим образом:

Количество и тип входных аргументов может быть любым. Для примера опишем функцию с двумя входными параметрами формата :

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

Переменные

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

С помощью оператора определяем перечень переменных, причём тип данных указываем в конце выражения.

Объявление возможно как на уровне пакета, так и на уровне функции. Рассмотрим пример:

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

Оператор цикла

В языке Go один оператор цикла — это , который повторяет список инструкций заданное количество раз. Цикл состоит из трёх выражений:

  1. Инициализация. Выполняется перед первой итерацией.
  2. Условие. Вычисляется перед каждой итерацией.
  3. Инкремент. Выполняется после каждой итерации.

Общая форма цикла выглядит так:

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

Цикл останавливает свою работу, когда условие принимает значение .

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

Рассмотрим пример программы:

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

Условный оператор

Форма определения условного оператора в Go выглядит следующим образом:

Если выражение в поле условия истинно, код, размещённый между фигурными скобками, выполнится.

Условие описывается значением, переменной или выражением. Например:

  • — выполняется всегда;
  • — выполняется, когда меньше ;
  • — выполняется, когда меньше или меньше ;
  • — выполняется, когда меньше и меньше .

Рассмотрим пример программы:

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

Массивы

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

Чтобы объявить массив, необходимо указать тип и требуемое количество элементов следующим образом:

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

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

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

Рассмотрим пример программы:

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

Срезы

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

Объявить срез можно как массив, но без указания размера или с помощью функции :

Размер массива фиксирован, а у среза изменяемый. По сути, срез — более общий вид массива.

Тип — срез с элементами типа .

— срез 5 элементов массива .

Рассмотрим пример программы:

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

Структуры

Структура (structure) — пользовательский тип данных, который кроме прочего комбинирует элементы разных типов. Чтобы объявить структуру, используем выражения и .

определяет тип данных, которому соответствует два и более элементов.

связывает заданное имя с описанием структуры.

Форма описания выглядит следующим образом:

Как только структура типа определена, он может использоваться при объявлении новых переменных:

Чтобы получить доступ к элементам структуры, используем оператор доступа к элементу. Рассмотрим на примере:

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

Почему Go и Rust не соперники, а чертовы враги

Перевод

Прим. переводчика — это всего лишь перевод статьи, которая отражает альтернативную точку зрения на тему «Go против Rust». Вовсе не обязятельно показывать свое несогласие с мнением автора на карме переводчика, спасибо.
Эта статья — небольшой ответ к записи в блоге Дейва Чейни «Почему Go и Rust не соперники». Я настоятельно рекомендую вам почитать его доводы! Вероятно, вам также понравится замечательная дискуссия на реддите.
На самом деле, Go и Rust решают одну и ту же самую проблему: оба пришли в наш мир, чтобы сделать жизнь программистов проще. Go до безобразия упростил концепт конкурентного (ака многопоточного) программирования и мне кажется, сделал программирование приятным занятием, ведь код на Go действительно приятно читать. В то ж время, Rust подарил нам мощные zero-cost абстракции… для паттерн-матчинга. Звучит оправданно, не так ли? Шутки-шутками, но Rust действительно сделал многие непростые штуки проще (частое заблуждение: он не избавился от них). Его дьявольская система типов позволяет гарантировать безопасность памяти, и в том числе, избавиться от состояния гонки, что звучит очень заманчиво.

Вышел Go 1.5

Сегодня, 19 августа 2015, проект Go с гордостью представляет Go 1.5 — шестой стабильный релиз языка Go.
В этой версии было сделано множество серьезных изменений в реализации языка. Компилятор и рантайм был , убрав последние остатки C из кодовой базы Go. Сборщик мусора был , что позволило уменьшить паузы во время сборки мусора на порядки. Сопутствующие изменения в планировщике рантайма, позволили нам изменить значение (количество одновременно исполняющихся горутин) с 1 до количества логических CPU. Изменения в линкере позволили распространять Go пакеты в виде динамических библиотек, которые можно линковать как с Go, так и с C программами (дизайн).

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

Хотел бы поделиться своей разработкой, которая, думаю, пригодится пользователям Telegram.
Многие из нас так или иначе пользуются или хотя бы пробовали пользоваться напоминалками. Их сейчас множество: платные и бесплатные, мобильные и десктопные, сложные и простые — как говорится, на любой вкус.
Для меня главным требованием к таким напоминалкам является простота установки напоминания, иначе говоря, возможность ввода напоминания своими словами. Например, «через 20 минут перезвонить коллеге» или «завтра в 15 в налоговую»

Важно также, чтобы напоминалка умела откладывать напоминания.
Подобную напоминалку я как-то искал под Linux и, не найдя, написал сам. А для Windows я всем советовал похожую программку XMinder.
Время прошло, возможностей для разработки и реализации таких напоминалок стало больше.
И одна из таких возможностей — боты в Telegram.
Я подумал, было бы здорово найти такого бота, который бы принимал запросы на напоминания, написанные своими словами, и отправлял бы в установленное время соответствующие сообщения

Но такого бота, который бы понимал простой русский язык, я не нашел и написал своего.
Бот называется @remindmemegabot. Реализован на языке Golang с использованием библиотек tgbotapi и at и развернут на сервере под управлением Linux.

(Почти) бесполезный стриминг вебкамеры из браузера. Часть 2. WebRTC

Как-то в одной из старинных и уже заброшенных статей я писал о том, как легко и непринужденно можно транслировать видео с canvas через websockets. В той статье поверхностно рассказывал о том, как захватить видео с камеры и звук с микрофона посредством MediaStream API, как полученный поток кодировать и отправлять через websockets на сервер. Однако в реальности так не делают, для трансляций используют либо специальный софт, который нужно устанавливать и настраивать: навскидку это может быть Open Broadcast Software, либо задействуют WebRTC, который работает прямо из коробки, то есть не требует установки никаких плагинов аля flash player, который вот уже в декабре выпилят из Chromium браузера.

Сегодня поговорим о WebRTC.

Пишем движок полнотекстового поиска на Go

Перевод

Полнотекстовый поиск — один из тех инструментов, которые мы используем практически каждый день, когда ищем какую-то информацию в интернете. Full-Text Search (FTS) — это метод поиска текста в коллекции документов. Документ может ссылаться на веб-страницу, газетную статью, сообщение электронной почты или любой структурированный текст.
Сегодня мы собираемся написать собственный движок FTS. К концу этой статьи он сможет выполнять поиск по миллионам документов менее чем за миллисекунду. Начнём с простых поисковых запросов, таких как «Выдать все документы со словом cat», а потом расширим движок для поддержки более сложных логических запросов.

Ошибки — это значения

(Перевод статьи из официального блога Go)Частой темой среди Go программистов, особенно тех, которые только познакомились с языком, является вопрос о том, как обрабатывать ошибки. Разговор часто сводится к жалобам на то, что последовательность

появляется слишком часто. Недавно мы просканировали все open-source проекты, которые мы только смогли найти и увидели, что этот сниппет появляется лишь раз на страницу или две, гораздо реже, чем многие могли бы подумать. И всё же, если впечатление того, что вы должны всегда писать

остается, значит, очевидно, что-то тут не так, и мишенью оказывается сам Go.
Это неверно, это вводит в заблуждение и это легко исправить. Наверное происходит следующее — программист, знакомясь с Go, задаёт вопрос — «Как я должен обрабатывать ошибки?», заучивает этот паттерн и тут и останавливается. В других языках, это может быть блок try-catch или другой механизм обработки ошибок. Соответственно, думает программист, там где я бы использовал try-catch в моём старом языке, в Go я просто напечатаю if err != nil. Со временем, в Go коде накапливается много таких сниппетов, и результат выглядит неуклюже.
Но вне зависимости от того, как это объясняется на самом деле, очевиден тот факт, что эти Go программисты упускают фундаментальную идею ошибок: Ошибки это значения.

Жизнь в одну строчку

Перевод

Если уменьшение размера бинарников Go на 6% — это то, в чем вы отчаянно нуждаетесь, то эта статья для вас. (Я проводил этот эксперимент в рамках помощи Tailscale. Следует отметить, что я инвестор.) Если же вас не сильно заботит размер двоичных файлов, что ж, может быть, вам хотя бы будет интересно почитать это для развлечения.

Чтобы получить примерные цифры для этой статьи, я взял первый попавшийся файл из моего GOPATH. Все конкретные цифры в этой статье относятся к github.com/mvdan/sh/cmd/shfmt. После нескольких экспериментов, они кажутся мне довольно репрезентативными.

В качестве базового комита я использую коммит 9d812cfa5c тулчейна Go. Это ветка master по состоянию на 29 апреля 2020 г.; вероятно, он будет схож с версией Go 1.15beta1. Я использую его, а не Go 1.14, потому что он включает в себя несколько сокращений размера бинарников, в том числе одно конкретное, которое вам обязательно понадобится, если для вас важен размер.

Редактирование «Автозамены»

Обзор функций

Docker: Окружение для тестирования

Последние пять лет принесли в нашу жизнь огромное количество технологий, с помощью которых можно быстро создавать изолированные окружения для разработки и тестирования. Но не смотря на это, организовать стабильное окружение для тестирования — далеко не самая простая задача. А если нужно тестировать сетевые взаимодействия компонентов и анализировать предельный уровень нагрузки на них, то задача становится еще сложнее. Добавив возможность быстрого развертывания окружения и гибкой настройки отдельных компонентов, мы сможем получить небольшой интересный проект.
В этой статье мы подробно расскажем о создании окружения на базе Docker контейнеров для тестирования нашего клиент-серверного приложения. При этом, если смотреть глобально, то данная статья будет хорошей иллюстрацией использования Docker и его ближайшей экосистемы.

История языков программирования: от Objective C к Swift

Чтобы отказаться от языка программирования, на котором уже ведется коммерческая разработка, и начать учить новый, программистам нужны серьезные основания. Но история ИТ-индустрии знает много случаев, когда выбор за них делало время, и переход происходил как бы сам по себе.
Что заставило множество разработчиков перейти на Objective C? Что сейчас заставляет отказаться от него и выбрать Swift?
Objective C является расширением языка Си, в который были добавлены новые возможности для объектно-ориентированного подхода программирования. Язык использует объектную модель Smalltalk. Полностью совместим с языком программирования Си. Компания Apple долгое время использовала Objective C как основной язык программирования для разработки своих продуктов.
Создателями Objective C являются Брэд Кокс и Том Лав. Они начали работать над ним в начале1980-х годов, когда еще были сотрудниками телекоммуникационной компании ITT Corporation. Примерно в то же время Кокс и Лав познакомились с языком программирования Smalltalk. Кокса тогда занимали проблемы повторного использования программного кода.

Лучшие планшеты для детей от 7 до 10 лет

Смерть goroutine под контролем

Вступление

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

Перевод статьи

Определенно одной из причин, почему людей привлекает язык Go, является первоклассный подход к параллелизму. Такие возможности как общение через каналы, легковесные процессы (goroutines) и их надлежащее планирование — не только являются родными для языка, но и интегрированны в него со вкусом.
Если вы послушаете разговоры в сообществе в течение нескольких дней, то велик шанс, что вы услышите, как кто-то с гордостью отметит принцип:
На эту тему есть запись в блоге, а также интерактивное упражнение (code walk).
Эта модель очень практична, и при разработке алгоритмов можно получить значительный выигрыш если подойти к задаче с этой стороны, но это уже не новость.
В своей заметке я хочу обратиться к открытому на данный момент в Go вопросу, связанному с этим подходом: завершение фоновой активности.

Сериализация данных или диалектика общения: простая сериализация

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

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

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

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

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

GopherCon Russia 2018: программа конференции готова

Всем привет!
Продолжаем рассказывать про GopherCon Russia, который пройдет 17 марта в Москве. В прошлом посте мы прошлись по первой половине программы, а теперь она готова полностью. Например, на конференцию приедут и выступят ведущий подкаста Go Time Brian Ketelsen и технический евангелист Microsoft Ashley McNamara.
Напомним, что будет два параллельных потока докладов с 10.00 до 19.00, огненное афтепати в баре с 19.00 и до упора, крутые активности от наших партнеров. Кстати, 16 марта тоже будет пара камерных событий о Go, подробности coming soon. На конференцию ждем 400 участников (200 из них уже зарегистрировались), присоединяйтесь!
Если вы очень-очень любите Go, то можете не читать дальше, а сразу регистрироваться на сайте. Цена билета — 7000 рублей.Итак, кто и о чем еще расскажет:

2.2. Длина идентификатора

сказалправильной

  • Краткие названия переменных хороши, если расстояние между объявлением и последним использованием невелико.
  • Длинные имена переменных должны оправдывать себя; чем они длиннее, тем большее значение должны представлять. Многословные названия содержат мало сигнала по отношению к своему весу на странице.
  • Не включайте в имя переменной название типа.
  • Названия констант должны описывать внутреннее значение, а не то, как используется это значение.
  • Предпочитайте однобуквенные переменные для циклов и ветвей, отдельные слова для параметров и возвращаемых значений, несколько слов для функций и объявлений на уровне пакета.
  • Предпочитайте отдельные слова для методов, интерфейсов и пакетов.
  • Помните, что имя пакета является частью имени, которое использует вызывающий объект для ссылки.

Moira: Realtime Alerting

Контур делает несколько десятков продуктов, каждый из которых состоит из нескольких десятков микросервисов, каждый из которых запущен на десятках серверов.
Эта инфраструктура порождает метрики на всех технологических уровнях — нагрузка на железо, состояние ОС, метрики приложений. Исходные данные собираются в один большой кластер Graphite. Сейчас у нас есть миллион уникальных метрик, по которым суммарно генерируется 20 тысяч значений в секунду.
Ясно, что за миллионом метрик не уследить глазами на телевизорах и дашбордах — нужна система отправки уведомлений о нештатных ситуациях. Перед тем как написать свою систему Moira, мы использовали для этой задачи Seyren.

Разбираемся в Go: пакет io

  • Перевод
  • Tutorial

Перевод одной из статей Бена Джонсона из серии «Go Walkthrough» по более углублённому изучению стандартной библиотеки в контексте реальных задач.

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

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

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

Technical Details

Go: десериализация JSON с неправильной типизацией, или как обходить ошибки разработчиков API

Недавно мне довелось разрабатывать на Go http-клиент для сервиса, предоставляющего REST API с json-ом в роли формата кодирования. Стандартная задача, но в ходе работы мне пришлось столкнуться с нестандартной проблемой. Рассказываю в чем суть.
Как известно, формат json имеет типы данных. Четыре примитивных: строка, число, логический, null; и два структурных типа: объект и массив. В данном случае нас интересуют примитивные типы. Вот пример json кода с четырьмя полями разных типов:

Как видно в примере, строковое значение заключается в кавычки. Числовое — не имеет кавычек. Логический тип может иметь только одно из двух значений: true или false (без кавычек). И тип null соответственно имеет значение null (также без кавычек).
А теперь собственно сама проблема. В какой-то момент, при детальном рассмотрении получаемого от стороннего сервиса json-кода, я обнаружил, что одно из полей (назовем его price) помимо числового значения периодически имеет строковое значение (число в кавычках). Т. е. один и тот же запрос с разными параметрами может вернуть число в виде числа, а может вернуть это же число в виде строки. Ума не приложу, как на том конце организован код, возвращающий такие результаты, но видимо, это связано с тем, что сервис сам является агрегатором и тянет данные из разных источников, а разработчики не привели json ответа сервера к единому формату. Тем не менее, надо работать с тем что есть.
Но далее меня ждало еще большее удивление. Логическое поле (назовем его active), помимо значений true и false, возвращало строковые значения «true», «false», и даже числовые 1 и 0 (истина и ложь соответственно).

Резюме

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

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

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

Как ввести длинное тире на компьютере с операционной системой Windows

Вызов функций Go из других языков

Перевод

С версии 1.5 компилятор Go поддерживает несколько режимов сборки, определяемых флагом . Их ещё называют режимами исполнения Go (Go Execution Modes). С их помощью может компилировать пакеты Go в нескольких форматах, включая архивы и библиотеки общего пользования Go (shared libraries), архивы и библиотеки общего пользования Си, а с версии 1.8 — и динамические плагины Go.

В статье мы рассмотрим компилирование пакетов Go в библиотеки Си. В этом режиме сборки компилятор генерирует стандартный бинарный файл объекта (shared object) (.so), передавая функции Go в качестве API в стиле Си. Мы поговорим о том, как создавать библиотеки Go, которые можно вызывать из C, Python, Ruby, Node и Java.

Весь код доступен на GitHub.

Куда обращаться за помощью?

Этот вопрос актуален для тех, кто не готов самостоятельно выполнять вышеописанные действия. Позвонить лучше всего в диспетчерскую службу Вашей управляющей компании, если таковая имеется. Можно вызвать электрика из любой организации, оказывающей услуги такого рода. Диспетчеру следует сообщить, что конкретно перестало работать, есть ли свет, как это произошло: после того, как сгорел электроприбор, после короткого замыкания или потопа. Как вы понимаете за услуги электрика придется заплатить вам или вашим соседям, если вина на их стороне (к примеру, затопили вас, в результате чего перестали работать розетки в половине квартиры либо одной комнате).

Хобби-проект польского разработчика — усовершенствованная и дополненная версия языка Go

Один из признаков того, что язык программирования имеет успех, – появление новых языков на его основе. Известным примером является JavaScript. На его базе возникли такие языки, как TypeScript, GorillaScript, Kaffeine, Sweet.js и так далее.
Со временем язык программирования Go, разработанный компанией Google, сможет соперничать с JavaScript по количеству надстроек и диалектов.
Миру уже был явлен Oden – функциональный язык со статической типизацией, разработанный в рамках экосистемы Go. В то же время он создавался как надстройка Go и впитал в себя его лучшие стороны.
А теперь появился новый язык – Have, который имеет все шансы стать усовершенствованной и дополненной версией Go.

Разбираемся в Go: пакеты bytes и strings

  • Перевод
  • Tutorial

Перевод одной из статей Бена Джонсона из серии «Go Walkthrough» по более углублённому изучению стандартной библиотеки Go в контексте реальных задач.

В предыдущем посте мы разобрались, как работать с потоками байт, но иногда нам нужно работать с конкретным набором байт в памяти. Хотя слайсы байт вполне подходят для многих задач, есть немало случаев, когда лучше использовать пакет bytes. Также мы рассмотрим сегодня и пакет strings, так как его API практически идентичен bytes, только он работает со строками.

Этот пост является одним из серии статей по более углублённому разбору стандартной библиотеки. Несмотря на то, что стандартная документация предоставляет массу полезной информации, в контексте реальных задач может быть непросто разобраться, что и когда использовать. Эта серия статей направлена на то, чтобы показать использование пакетов стандартной библиотеки в контексте реальных приложений. Если у вас есть вопросы или комментарии, вы всегда можете написать мне в Твиттер — @benbjohnson.

Внедрение зависимостей во время компиляции

Термин «внедрение зависимостей» (dependency injection) получил плоху репутацию. Обычно люди сразу начинают думать про XML-файлы Spring-а. Но на самом деле, этот термин означает, что мы передаём зависимости объекту, а не объект ищет их сам.

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

Также важно понимать, что пакет main является тоже адаптером. Он соединяет терминал с вашим доменом

Заключение

Дизайн приложения это сложная проблема. Нужно принимать массу решений и без хорошего набора принципов, проблема становится ещё хуже. Мы посмотрели на несколько подходов к структуризации Go приложений и рассмотрели их недостатки.

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

Посмотрите на такой подход в следующем вашем приложении. Если у вас есть вопросы или вы хотите обсудить дизайн приложений, я доступен в Твиттере — @benbjohnson или как benbjohnson в Slack-канале по Go.

Современный подход к сборке мусора

Перевод

В последнее время мне встречалось немало статей, в которых не самым удачным для меня образом продвигается свежий сборщик мусора в Go. Некоторые из статей написали разработчики самого языка, и их утверждения намекали на радикальный прорыв в технологии сборки мусора.
Вот первичный анонс о внедрении нового сборщика, датированный августом 2015-го:
Создатели утверждают, что они не просто решили проблему пауз на сборку мусора, а пошли куда дальше:
Не сомневаюсь, что многие пользователи Go были просто счастливы получить новый подход к runtime’у в Go. Но у меня есть претензии к этим заявлениям: они выглядят как недостоверный маркетинговый булшит. А поскольку они раз за разом воспроизводятся в Сети, пришло время подробно с ними разобраться.

BitDegree

Что вы изучите?

Узнайте, как создавать программы с GO Узнайте всё про структуры данных Научитесь серьёзно упрощать сложные программы Научитесь использовать продвинутые функции Golang

Если вы являетесь программистом, который уверенно себя чувствует при работе с Java или другим популярным языком программирования, то для вас курс про язык программирования Go будет идеальным! Хотите ли вы научиться принимать активное участие в разработке проекта на вашей работе или вы просто хотите добавить в список своих навыков новый язык программирования — добро пожаловать на курс!

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

История

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

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

Оптимизация работы с PostgreSQL в Go: от 50 до 5000 RPS

Привет, меня зовут Иван, и я делаю Авито Доставку. Когда пользователь покупает товар с доставкой, мы показываем ему список отделений служб доставки с ценами. Цена доставки может меняться от отделения к отделению. Мы смотрим на область карты, где покупатель ищет товар и информацию по объявлению, например, координаты продавца, вес и размеры товара. И на выходе показываем человеку список отделений с адресами и ценой доставки в каждое из них.

В ходе разработки калькулятора цены доставки возникла такая задача: есть структура базы данных PostgreSQL и запрос к ней от сервиса на Go. Нужно заставить всё это работать достаточно быстро. В итоге нам удалось поднять пропускную способность сервиса с 50 до 5000 RPS и выявить пару нюансов при общении сервиса с базой. Об этом и пойдёт рассказ.

Как работает программа распознавания лиц?

Как поставить тире на клавиатуре компьютера или ноутбука?

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

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

Adblock
detector