Программирование на go
Содержание:
- История развития Go
- Выбор языка (Haskell vs Go)
- 8.2. Оставьте параллелизм вызывающей стороне
- Чертежи верхних и нижних угловых шкафов
- Опыт применения Go в продакшене Яндекса
- Куда обращаться за помощью?
- Как поставить тире на клавиатуре компьютера или ноутбука?
- Обзор функций
- Я перехожу на JavaScript
- Soft Mocks для Go! (переопределение функций и методов в runtime)
- Soft Mocks для Go!
- Функциональность
- slit — новое слово в мире PAGERов, либо как тратить меньше времени на просмотр логов
- Что я изменил бы в Go
- О репозиториях замолвите слово
- Современный подход к сборке мусора
- Лучшие планшеты для детей от 7 до 10 лет
- Как ввести длинное тире на компьютере с операционной системой Windows
- Ускоряем кеш проекта в NoVerify (линтер для PHP) в 10 раз
- Unit-тестирование в Go с помощью интерфейсов
- Technical Details
- Разбираемся в Go: пакет io
- Грузите апельсины бочках. Релизы в Golang проектах
- Книга «Golang для профи: работа с сетью, многопоточность, структуры данных и машинное обучение с Go»
- О функциональности Go
- OTUS
- man!(D => Rust).basics
- Как работает программа распознавания лиц?
- По-настоящему живая перезагрузка кода в golang
- Какими особенностями должна отличатся шпаклевка для отделки фасада?
- Функциональное программирование в go
- Работа в IPFS с человеческим лицом
- Заключение
История развития Go
Язык Go элегантен и прагматичен, но некоторые его особенности имеют смысл только под определенным историческим контекстом. История Go начинается с Си. Во многих отношениях Си стал основой для создания JavaScript, Ruby, Python, C++, C# и Java. Компиляторы или интерпретаторы некоторых из этих языков даже написаны на Си. Влияние Си легко заметить во многих языках. Он был разработан Денисом Ритчи для создания ядра Unix и потом использовался для создания ядра Linux.
Язык Go был создан легендами эпохи Unix и Си. Работая Google, Роберт Грисемер, Роб Пайк и Кен Томпсон были разочарованы в Си-языках из-за их проблем. Бъярн Страуструп, создать C++ говорил так: «Си позволяет легко выстрелить себе в ногу, в C++ это сложнее, но если вы все же выстрелите, то взорвете ногу целиком».
Go наследует много хорошего от Си. Ключевые слова и сила синтаксиса, процедурный подход — это сильные стороны обоих языков. С другой стороны, ручное управление памятью и время компиляции — это проблема Си. Go решает эти проблемы с помощью сборки мусора, безопасной работы с памятью и очень быстрой компиляции.
Язык Java выбирают многие крупные компании с большими командами разработчиков. Go перенимает и этот плюс у Java и пытается быть отличным языком для больших групп разработчиков. Язык Go не имеет таких недостатков объективно ориентированного программирования, как наследование. Все реализуется с помощью лаконичного синтаксиса интерфейсов.
Также можно найти определенное сходство с динамическими языками, Go перенимает стиль написания кода у Python, настраиваемость у Ruby и простой параллелизм, вшитый в ядро языка, как у Node.js. Все начиналось, как язык, решающий некоторые проблемы Си и выросло в прекрасный язык программирования общего назначения.
Выбор языка (Haskell vs Go)
Перевод
Перевод статьи о вопросе выбора языка и компромиссе сложности и продуктивности.
Предупреждение: это разглагольствование.
Недавно я сделал очередной большой шаг вперед на своём пути просвещения в Хаскеле. Наконец-то я вижу, как много различных частей мозаики Хаскеля гармонично складываются воедино. На этом моменте, я почувствовал, что готов идти вперёд и писать полезные программы. Я прочёл исходный код web-фреймворка Scotty и был приятно удивлён тем, что я прекрасно понимал, как он работает. Я полностью влюблён в Хаскель. Мне нравится, что он заставляет тебя думать. Ты не просто открываешь текстовый редактор и начинаешь ударять по клавишам, чтобы написать программу на Хаскеле. Я люблю то, что Хаскель поощряет обобщения и абстракции. Одним из «эврика»-моментов в моём пути было понимание всех последствий того, почему функция типа a -> a имеет только одну реализацию. Я подсел на возможность запустить программу в первый раз и знать, что она заработает (после борьбы с компилятором целую вечность). Я думаю, что монады и линзы — очень умные вещи. Да по многим критериям, Haskell — идеальный язык программирования.
И у меня заняло 4 года прийти к этому.
8.2. Оставьте параллелизм вызывающей стороне
- Используя закрытый канал в качестве сигнала, что больше нет элементов для обработки, не может сообщить вызывающему объекту о неполном наборе элементов из-за ошибки. У вызывающего нет никакого способа передать разницу между пустым каталогом и ошибкой. В обоих случаях, похоже, канал будет немедленно закрыт.
- Вызывающий должен продолжать чтение из канала, когда тот закрыт, потому что это единственный способ понять, что горутина заполнения канала перестала работать. Это серьёзное ограничение на использование : вызывающий тратит время на чтение из канала, даже если получил все необходимые данные. Вероятно, это более эффективно с точки зрения использования памяти для средних и больших каталогов, но метод не быстрее, чем исходный метод на основе среза.
Чертежи верхних и нижних угловых шкафов
Рассмотрим чертежи различных конструкций для кухни.
Гнутые фасады и между ними угол со шкафами
Выигрышно смотрится кухонный гарнитур, в котором угол идет с закругленными шкафами. Это дает возможность комфортно мыть посуду и пользовать раковиной. Эта обтекаемая форма хорошо смотрится, если на одной стене будут стоять шкафы с выгнутыми дверцами.
Гарнитур хорошо впишется в следующие размеры комнаты: длина стены 2420х1750 мм. Данная конструкция имеет шкафы с гнутыми фасадами:
- 900х900 мм – напольный угол;
- 600х600 мм – навесной угол;
- 320 мм, если изделие с выгнутыми дверцами;
- 600 мм – место для вытяжки и встроенной техники.
Размер условный, так как на большой кухне можно установить вытяжку и варочную панель, каждую шириной до 90 см. Размер изделия с гнутым фасадом зависит от радиуса двери. Если изменить ширину шкафа, тогда уменьшится или увеличится фасад.
Если поменять размер с 900х900 мм на 700х700 мм, тогда необходимо сохранить стандартную глубину столешницы около 600 мм. Радиус двери получается маленьким, поэтому доступ в сам шкаф будет значительно ограничен.
То же самое относится и к навесному шкафу с дверью вогнутого типа. Глубина составит 300 мм, радиус фасада будет стандартных размеров, а ширина шкафа – 600х600 мм.
Угол с прямыми фасадами шкафов
Расчет схож с разметкой, как для гарнитура с угловой кухней и вогнутым углом. Особенности: форма прямоугольника, фасады прямые, столешница с завалом, она может состоять из нескольких фрагментов, целой её сложно сделать.
Этот вариант хорошо будет смотреться на кухне с размерами 2000х1500 мм. На короткой стене глубина столешнице должна составлять 400 мм. Для того чтобы уменьшить глубину столешницы, необходимо использовать шкаф с шириной 900х700 мм. Это дает возможность экономить пространство. Такой же вариант необходимо применить для шкафа, в котором вогнута дверь.
Необходимо помнить, что мойку в такой шкаф можно ставить только круглой формы, с диаметром до 490 миллиметров. На одну из стен вмонтировать барную трубу. Если глубина столешницы равна 400 мм, тогда навесные корзины с барной трубой должны быть не больше 350 миллиметров.
Угол 90 градусов
Прямой угол кухонному гарнитуру создают: приставной шкаф, ширина которого 750х1200 миллиметров, дверь – 400 мм, шкафы – 1100х1200 и 500х600 миллиметров. Шкаф 750х900 миллиметров используют на кухнях, в которых уменьшается глубина столешницы вдоль одной стены. Размеры шкафа 1000х600 дают возможность использовать столешницу 600 миллиметров.
Размер мойки в подобные столешницы должен быть меньше ширины самого шкафа на 100 миллиметров.
О том, как быстро рассчитать угловой модуль кухонного гарнитура, смотрите в следующем видео.
Опыт применения Go в продакшене Яндекса
Хочу поделиться опытом использования языка Go в продакшн-системах Яндекса. Вообще мы здесь довольно консервативно относимся к тому, какие языки использовать для реальных систем. И это лишь добавляет полезности тому опыту, который мы получили в этот раз.
Мы начали разрабатывать на Go летом прошлого года. Тогда появился фреймворк Go для облачной платформы Cocaine. До этого приложения серверного API Браузера писались в основном на C++ и Python. Серверный API в это время как раз переходил на облачную платформу, и мы по большей части только определялись с тем, какие технологии использовать в будущем для него. API выполняет следующие функции: получить данные, обработать, отправить во внутренний сервис Яндекса, ещё раз обработать, отдать назад Браузеру. Набор простых приложений.
Недостатком C++ для нас был явный оверкилл для наших целей, на разработку уходила уйма времени, также большой проблемой для нас было то, что плюсовый фреймворк для Кокаина не представлял никакой возможности работать асинхронно, кроме как с помощью коллбэков. У нас было много обращений к различным сервисам, поэтому в результате скоро весь код стал одной большой лапшой из коллбэков. Масштабировать и отлаживать ее было очень сложно.
Куда обращаться за помощью?
Этот вопрос актуален для тех, кто не готов самостоятельно выполнять вышеописанные действия. Позвонить лучше всего в диспетчерскую службу Вашей управляющей компании, если таковая имеется. Можно вызвать электрика из любой организации, оказывающей услуги такого рода. Диспетчеру следует сообщить, что конкретно перестало работать, есть ли свет, как это произошло: после того, как сгорел электроприбор, после короткого замыкания или потопа. Как вы понимаете за услуги электрика придется заплатить вам или вашим соседям, если вина на их стороне (к примеру, затопили вас, в результате чего перестали работать розетки в половине квартиры либо одной комнате).
Как поставить тире на клавиатуре компьютера или ноутбука?
Обзор функций
Я перехожу на JavaScript
Перевод
После того, как я 5 лет писал на Go, я решил, что мне пора двигаться дальше. Go хорошо послужил мне. Вероятно, это был лучший язык, которым я мог бы пользоваться столько времени, но теперь настал момент оставить Go.
Не могу сказать, что я насмотрелся на ограничения и проблемы Go. За годы работы не случилось ничего такого, что подтолкнуло бы меня к переходу на язык, лучше соответствующий требованиям завтрашнего дня, или на язык, вокруг которого сложилось более успешное сообщество.
Мне не хотелось бы писать материал о том, почему я перешёл с Go на JavaScript, перечисляя минусы Go. Я полагаю, что подобные материалы оторваны от жизни и приносят читателям очень мало пользы. Поэтому я написал материал о том, что мне нравится в JavaScript, о том, что подвигло меня на переход.
Soft Mocks для Go! (переопределение функций и методов в runtime)
Soft Mocks для Go!
Основная идея Soft Mocks для PHP — это переписывание кода «на лету» перед include(), чтобы можно было поменять реализацию любых методов, функций и констант во время исполнения. Поскольку go — компилируемый язык, то логично делать то же самое на этапе компиляции. В этой статье я расскажу по свой проект Soft Mocks for Go.
Функциональность
Возможности Soft Mocks for Go весьма ограничены — вы можете временно переопределить нужные вам функции и методы, а потом откатить свои правки. Также можно вызвать оригинальную функцию.
При использовании soft mocks, следующий код:
Напечатает вот что:
Скачать библиотеку можно тут.
slit — новое слово в мире PAGERов, либо как тратить меньше времени на просмотр логов
Так уж вышло, что мне регулярно приходится просматривать много логов. Одно радует, не так много как у людей работающих вместе со мной у которых порой это основная работа. Логи эти не лежат в в какой либо централизованной системе, а хранятся в s3 и смотрим мы их скачивая с перенаправлением вывода в less.
less установлен у всех, все привыкли с ним работать, знают о базовых вещах, как поиск вперед-назад, фильтрация по &, переход в конец(G) файла, переход в начало(g) и так далее.
А так же, все уже смирились с тем, что в любой момент, при добавлении фильтра less может подвиснуть на неопределенный срок, выводить по строчке в 5 секунд и так далее. В конечном счете, особенно при считывании логов с stdin — приходится быть аккуратным. Фильтр может сработать, а может и не сработать.
Собственно, в тот момент, что и мне выпала участь в течении нескольких дней пройтись через этак пару сотен лог-файлов — стало очевидно — мир нужно менять к лучшему…
Под катом демо (gif 2.2mb) и немного истории.
Что я изменил бы в Go
Перевод
В течение полугода я программировал преимущественно на Go. И я разочарован. По двум причинам:
- В Go особенно трудно придерживаться функциональной парадигмы. По сути, язык . Меня это разочаровало, потому что в императивном коде, который я пишу, большое количество шаблонных кусков. К тому же, как мне кажется, в этом случае выше риск ошибок, в отличие от использования функциональных абстракций.
- Я считаю, что Go упускает свои шансы. В программных языках появились замечательные нововведения (особенно в сфере проверки и вывода типов — type inference), делающие код безопаснее, быстрее и чище. Мне хотелось бы, чтобы Google использовала своё влияние, чтобы поддержать некоторые из этих идей.
Я не первый, кто воспринимает Go подобным образом. Вот публикации других людей, разделяющих мои впечатления:
- Why Go Is Not Good
- Everyday hassles in Go
- Three Months of Go (from a Haskeller’s perspective)
- The Language I Wish Go Was
Ниже я добавлю свои соображения. Чтобы показать, как именно можно улучшить Go, я буду сравнивать его с Rust.
О репозиториях замолвите слово
В последнее время на хабре, и не только, можно наблюдать интерес GO сообщества к луковой/чистой архитектуре, энтерпрайз паттернам и прочему DDD. Читая статьи на данную тему и разбирая примеры кода, постоянно замечаю один момент — когда дело доходит до хранения сущностей предметной области — начинается изобретение своих велосипедов, которые зачастую еле едут. Код вроде бы состоит из набора паттернов: сущности, репозитории, value object’ы и так далее, но кажется, что они для того там “чтобы были”, а не для решения поставленных задач.
В данной статье я бы хотел не только показать, что, по моему мнению, не так с типичными DDD-примерами на GO, но также продемонстрировать собственную ORM для реализации персистентности доменных сущностей.
Современный подход к сборке мусора
Перевод
В последнее время мне встречалось немало статей, в которых не самым удачным для меня образом продвигается свежий сборщик мусора в Go. Некоторые из статей написали разработчики самого языка, и их утверждения намекали на радикальный прорыв в технологии сборки мусора.
Вот первичный анонс о внедрении нового сборщика, датированный августом 2015-го:
Создатели утверждают, что они не просто решили проблему пауз на сборку мусора, а пошли куда дальше:
Не сомневаюсь, что многие пользователи Go были просто счастливы получить новый подход к runtime’у в Go. Но у меня есть претензии к этим заявлениям: они выглядят как недостоверный маркетинговый булшит. А поскольку они раз за разом воспроизводятся в Сети, пришло время подробно с ними разобраться.
Лучшие планшеты для детей от 7 до 10 лет
Как ввести длинное тире на компьютере с операционной системой Windows
Ускоряем кеш проекта в NoVerify (линтер для PHP) в 10 раз
Одним вечером, обсуждая с Искандером @quasilyte сложности в разработке линтера для PHP на Go, Искандер упомянул, что тесты как-то долго идут при локальном прогоне (около минуты, и, как мне кажется, для Go это довольно долго). Стали копать, и быстро выяснилось, что в основном «тормозят» тесты, которые запускают NoVerify (название линтера) в режиме со включенным race-детектором. На каждый запуск индексируется репозиторий phpstorm-stubs, в котором содержатся все определения встроенных функций/классов/констант, которые есть в PHP, и индексация этого репозитория занимает около 4 секунд на 4-ядерной машине (замечу, что без race detector всё существенно быстрее). Поскольку таких прогонов делается несколько, по одному на каждый тестируемый open-source проект, суммарное время исполнения всех тестов может занимать минуты. NoVerify позиционирует себя как очень быстрый линтер для PHP, поэтому, конечно же, такая производительность несколько печалит и нужно было найти какое-то решение.
Unit-тестирование в Go с помощью интерфейсов
Вместо вступления
Эта статья посвящается тем, кто, как и я, пришел в Go из мира Django. Так вот, Django нас избаловал. Стоит только запустить тесты, как он сам, под капотом, создаст тестовую БД, прогонит миграции, а после прогона сам за собой приберёт. Удобно? Безусловно. Вот только времени на прогон миграций уходит — вагон, но это кажется разумной платой за комфорт, плюс всегда есть . Тем сильнее бывает культурный шок, когда бывалые джангисты приходят в другие языки, например в Go. То есть как-это никаких автомиграций до и после? Руками? А базу? Тоже руками? А после тестов? Что, и тирдаун руками? Ну и далее программист, перемежая код ахами и вздохами, начинает писать на Go джангу в отдельно взятом проекте. Конечно, выглядит всё это очень печально. Однако, в Go вполне возможно писать быстрые и надёжные юнит-тесты без использования сторонних сервисов типа тестовой БД или кэша.
Об этом и будет мой рассказ.
Technical Details
Разбираемся в Go: пакет io
- Перевод
- Tutorial
Перевод одной из статей Бена Джонсона из серии «Go Walkthrough» по более углублённому изучению стандартной библиотеки в контексте реальных задач.
Go является языком программирования, хорошо приспособленным для работы с байтами. Будь у вас списки байт, потоки байт или просто отдельные байты, в Go легко с ними работать. Это примитивы, на которых мы строим наши абстракции и сервисы.
Пакет io является одним из самых фундаментальных во всей стандартной библиотеке. Он предоставляет набор интерфейсов и вспомогательных функций для работы с потоками байтов.
Этот пост является одним из серии статей по более углублённому разбору стандартной библиотеки. Несмотря на то, что стандартная документация предоставляет массу полезной информации, в контексте реальных задач может быть непросто разобраться, что и когда использовать. Эта серия статей направлена на то, чтобы показать использование пакетов стандартной библиотеки в контексте реальных приложений.
Грузите апельсины бочках. Релизы в Golang проектах
Данная статья является продолжением инструментальной темы, затронутой в прошлой публикации. Сегодня мы постараемся разобраться со сборкой релизов Golang приложений в виде единого исполняемого файла, включающего ресурсные зависимости, и вопросом оптимизации размера итоговой сборки. Также рассмотрим процесс построения рабочего окружения отвечающего следующим требованиям:
- Переносимость. Окружение должно быть легко воспроизводимо на различных машинах.
- Изолированность. Окружение не должно влиять на версии установленных библиотек и программ на машине разработчика.
- Гибкость. Окружение должно позволять собирать релизы для различных версий Golang и Linux (разные версии дистрибутивов и glibc).
- Повторяемость. Не должно быть магии и тайных знаний, то есть все шаги сборки проекта и зависимостей должны быть описаны кодом.
Книга «Golang для профи: работа с сетью, многопоточность, структуры данных и машинное обучение с Go»
Привет, Хаброжители!
Вам уже знакомы основы языка Go? В таком случае эта книга для вас. Михалис Цукалос продемонстрирует возможности языка, даст понятные и простые объяснения, приведет примеры и предложит эффективные паттерны программирования. Изучая нюансы Go, вы освоите типы и структуры данных языка, а также работу с пакетами, конкурентность, сетевое программирование, устройство компиляторов, оптимизацию и многое другое. Закрепить новые знания помогут материалы и упражнения в конце каждой главы. Уникальным материалом станет глава о машинном обучении на языке Go, в которой вы пройдёте от основополагающих статистических приемов до регрессии и кластеризации. Вы изучите классификацию, нейронные сети и приёмы выявления аномалий. Из прикладных разделов вы узнаете: как использовать Go с Docker и Kubernetes, Git, WebAssembly, JSON и др.
О функциональности Go
Насколько объектно Go ориентирован многократно и эмоционально обсуждалось. Попробуем теперь оценить насколько он функционален. Заметим сразу, оптимизацию хвостовой рекурсии компилятор не делает. Почему бы? «Это не нужно в языке с циклами. Когда программист пишет рекурсивный код, он хочет представлять стек вызовов или он пишет цикл.» — замечает в переписке Russ Cox. В языке зато есть полноценные lambda, closure, рекурсивные типы и ряд особенностей. Попробуем их применить функциональным манером. Примеры покажутся синтетическими оттого, что во первых написаны немедленно исполняемыми в песочнице и написаны на процедурном все же языке во вторых. Предполагается знакомство как с Go так и с функциональным программированием, разъяснений мало но код комментирован.
OTUS
При переходе на Go люди зачастую сталкиваются с различными неудобствами, вызванными непохожестью Go на другие языки программирования. В этом курсе преподаватели хотели бы объяснить, что такое Go-way, рассказать про идиомы языка и помочь избежать типичных ошибок. Программа курса позволит погрузиться в разработку на Go для решения практических задач, углубления знаний в языке и сопутствующем технологическом стеке.
Выпускники смогут:
- писать production-ready код, многопоточные и конкурентные программы;
- понимать синтаксис и внутреннее устройство языка Go;
- понимать особенности сетевого программирования;
- уметь создавать микросервисы с помощью Go;
- разворачивать микросервисы с помощью docker.
man!(D => Rust).basics
Просьба не воспринимать эту статью слишком серьёзно, переходить с D на Rust не призываю, просто после прочтения серии переводов за авторством Дмитрия aka vintage, мне стало любопытно переписать примеры кода на Rust, тем более, что автор добавил этот язык в голосование. Мой основной рабочий инструмент — С++, хотя в последнее время активно интересуюсь Rust. За D несколько раз пытался взяться, но каждый раз что-то отталкивало. Ни в коем случае не хочу сказать, что это плохой язык, просто местами он «слишком радикален» для «убийцы плюсов», например, имеется GC (пусть и отключаемый), а в других местах наоборот слишком близок к С++ со всеми его неочевидными нюансами.
Самое забавное тут то, что после изучения Rust отношение к D несколько изменилось — в плане лаконичности и выразительности последний сильно выигрывает. Впрочем, «явность» Rust-сообщество наоборот считает преимуществом. По моим ощущениям, в Rust чаще руководствуются «академической правильностью», а в D более практичный подход. Что лучше — сложный вопрос, лично я и сам не всегда могу определиться.
Впрочем, это всё очень субъективно, так что давайте вместе посмотрим на код. Код на Go приводить не буду, при желании, можно посмотреть в оригинальной статье.
Как работает программа распознавания лиц?
По-настоящему живая перезагрузка кода в golang
Если вы разрабатываете веб-приложения на го, то эта статья, возможно, будет вам интересна. До того, как перейти на go, я в основном программировал на PHP и мне всегда нравилось то, что можно сохранить файл, перезагрузить страницу и увидеть результат, который сгенерирован уже новым кодом. Большие программы на go могут компилироваться несколько десятков секунд, что весьма быстро, но всё равно ощутимо. Возможно ли сделать аналог Java hotswap (замена тела метода в runtime), ведь Go компилируется в нативный код? Ответ — да, возможно, но только для разработки. В данный момент мне неизвестно о готовых инструментах, которые бы позволяли это автоматизировать. В этой статье я хотел бы продемонстрировать proof-of-concept «живой перезагрузки» с использованием пакета plugin в go1.8beta2 и пакета github.com/bouk/monkey. Пытливый читатель скорее всего уже догадывается, что мы будем делать.
Какими особенностями должна отличатся шпаклевка для отделки фасада?
Отделка фасада шпаклевкой
Шпаклевочная масса для оформления фасадов используется не только для придания строению красивого внешнего вида, но и для того, чтоб защитить поверхности от различных пагубных воздействий внешней среды и механических повреждений, которые смогут сократить срок его эксплуатации.
В первую очередь такими внешними раздражителями для конструкции могут стать:
- осадки в виде дождя, снега и пр.;
- палящие лучи солнца;
- повышенный уровень влажности;
- мороз;
- резкие колебания температурных показателей.
Помимо этого, фасаду здания всегда достается большая нагрузка, нежели перекрытиям внутри помещения.
Наружная отделка стен шпаклевкой
Не стоит также забывать и о контроле за микроклиматом в помещении, на который имеет непосредственное влияние отделка стен снаружи.
Взяв во внимание эти факторы, можно подвести итог, что шпаклевка для обработки фасада должна отличаться такими особенностями:
- повышенным уровнем водо- и морозостойкости;
- улучшенной паропроницаемостью;
- достаточной прочностью и пластичностью;
- низким процентом усадки после высыхания (чтоб поверхность не подвергалась образованию трещин);
- раствор не должен иметь в своем составе экологически небезопасных веществ.
Конечно, эти особенности очень важны для любой шпаклевки, но в первую очередь это неотъемлемые показатели, которыми обязана отличаться именно финишная шпаклевка, ведь вся существенная нагрузка будет возлагаться на нее.
Функциональное программирование в go
Набор конструкций для контроля хода выполнения программы в языке go скуднее по сравнению с языком C. В go доступны только конструкции , и . Первое, что бросается в глаза, это отсутствие круглых скобок.
Листинг 7. Конструкции для управления ходом выполнения программы
Loop: for i := 0; i < 10; i++ { switch f(i) { case 0, 1, 2: break Loop } g(i) }
При этом конструкция сохранилась, а операции инкремента и декремента более не являются выражениями, и их нельзя подставлять в вычисления. Префиксная форма совсем отсутствует.
Функции объявляются при помощи ключевого слова . Особенностью является то, что они могут возвращать сразу несколько значений, по аналогии с множественным присваиванием, как показано в листинге 8.
Листинг 8. Множественное присваивание и создание функций
var v1,v2 uint32 = 10, 20 func MySqrt(f float) (v float, ok bool) { if f >= 0 { v,ok = math.Sqrt(f),true } else { v,ok = 0,false } return v,ok }
После параметров в скобках указываются типы возвращаемых значений. В случае c одним значением скобки не используются. Еще одна интересная возможность — это выражение defer, пример использования которого приведен ниже.
defer foo();
Конструкция представляет собой некий триггер, и функция будет вызвана по достижении . Если используется в функции несколько раз, то соответствующие методы выстраиваются в стек. Польза от подобного нововведения неочевидна, особенно при большом объеме кода. Так программисту, незнакомому с кодом, придется держать в памяти весь этот стек вызовов со всеми параметрами. При использовании структурное программирование не обеспечивается.
Работа в IPFS с человеческим лицом
Из песочницы
Немногие слышали про IPFS, ещё более немногие добрались до детального изучения. И совсем уж единицы погрузились в проект поглубже.
Если вкратце, IPFS это химера, созданная из технологий, лежащих в основе git и bittorrent, с одной особенностью — адресация объектов по содержимому (CAS).
Любой объект, файл или пользовательские данные хэшируются, и получившийся хэш становится адресом этого файла в системе IPFS. Далее, этот контент могут запросить другие узлы сети, и он расползётся по планете, и в идеале, никогда больше не исчезнет, будучи доступным по хэшу. Из этого свойства так же вытекает иммутабельность объектов в системе, ведь любое изменение содержимого создаёт новый адрес-хэш в сети.
Типичная ссылка на объект: http://ipfs.io/ipfs/QmPQGujZ4K1xPNNcCjBWMoSuYrcJae43dukJP51mbfftDK
Заключение
В 2009 go был признан языком года по версии организации TIOBE. Сложно сказать, насколько этот язык «созрел» для серьезных проектов, но его потенциал очевиден. Простота создания многопоточных и сетевых приложений позволяет говорить о жизнеспособности и востребованности проекта в целом. «Идеологическое родство» с языками С и С++, возможно, поможет языку go, как в свое время родство с С помогло развитию C++, а родство с C++ способствовало становлению Java. Огромную роль играет и поддержка со стороны разработчика языка – компании Google, возможно, самой влиятельной IT-компании на данный момент. В следующих статьях будут рассматриваться более сложные аспекты программирования на языке go.