По-английски суслик — gopher. Автор оригинального изображения — иллюстратор и писатель Рене Френч, жена Роба Пайка, одного из создателей Go. Изначально она рисовала суслика для промоушена радиостанции WFMU в Нью-Джерси. Спустя несколько лет, когда стартовал проект#Go и понадобился маскот, Рене адаптировала рисунок гофера. Так суслик стал талисманом нового языка программирования.
Изначально гофер был светло-коричневого цвета. Но когда решили выпустить мягкие игрушки, первые плюшевые экземпляры покрасили в синий. Так и повелось. Подробнее про гофера можно почитать в официальном блоге Go.
Важно знать, что правильное название языка — Go, а не Golang. Второй вариант используют потому, что go — часто употребляемый английский глагол, это затрудняет поиск материалов, относящихся к языку программирования. Из тех же соображений выбирали домен для официального сайта: golang.org.
Зачем миру понадобился ещё один язык?
Несмотря на то что Go — сравнительно молодой язык (первая версия появилась в 2009 году, а в 2012-м состоялся первый стабильный релиз), потребность в подобном языке возникла на рынке задолго до его создания.
С приходом на рынок многоядерных процессоров у разработчиков появилось дополнительное пространство для оптимизации, и новые условия требовали новых подходов к проектированию ПО. В частности, оно должно было поддерживать многопоточность.
Таким образом, при создании нового языка были выдвинуты основные требования и концепции:
- Язык должен быть максимально простым для изучения. Действительно, синтаксис Go крайне прост, всего лишь несколько десятков ключевых слов и синтаксических конструкций. Простота языка обеспечивает не только лёгкость освоения, но и снижение количества неявных ошибок.
- Управление памятью и сборка мусора. Выделение памяти в Go управляется компилятором в зависимости от контекста. Go автоматически определяет, где требуется разместить переменную — на стеке или в куче, что избавляет от многих ошибок и уязвимостей.
- Безопасность. Управление памятью осуществляется планировщиком, в результате чего нельзя выйти за пределы массива.
- Безопасные указатели. В Go отсутствует арифметика указателей, к которой привыкли пользователи С/С++. Указатель только может указывать на некоторый объект, нельзя создать указатель на произвольный объект памяти.
- Реализация ООП без наследования уменьшает сложность программ.
- Отсутствие механизма исключений — также намеренно. Это позволяет упростить отладку программ.
- Быстрая компиляция, позволяющая оперативно выполнять разработку сложных программ.
- Встроенный инструментарий тестирования, сетевые возможности.
- Нет средств обобщённого программирования и перегрузки функций. Это позволяет как ускорить компиляцию, так и снизить количество ошибок.
Note
В первую очередь язык Go ориентирован на создание микросервисов — небольших программ, взаимодействующих друг с другом.
Go Facts
Link to original
- Created in 2009.
- Docker, Kubernetes, Prometheus are written in Go.
- Just 25 keywords and 1 loop type (35 keywords in Python).
- Fun fact: UTF-8 was invented in 1992 by Ken Thompson and Rob Pike, two of the creators of Go.
Go Features
Link to original
- There’s no inheritance,
no generics, no aspect-oriented programming, no function overloading, no operator overloading. No pattern matching, no named parameters, no exceptions.- No built-in map, filter, reduce functions.
- In Go single quotes and double quotes are not interchangeable.
- Go doesn’t allow automatic type promotion between variables. You must use a type conversion when variable types do not match.
- Go has garbage collector.
- You cannot treat another Go type as a boolean.
- Constants in Go are a way to give names to literals. There is no way in Go to declare that a variable is immutable.
- Go requirement is that every declared local variable must be read. It is a compile-time error to declare a local variable and to not read its value.
- Any Unicode character that is considered a letter or digit is allowed in variable names.
- In Go,
nil
is an identifier that represents the lack of a value for some types.- Go is a call by value language. Every time you pass a parameter to a function, Go makes a copy of the value that’s passed in.
- According to the language specification, Go source code is always written in UTF-8. Unless you use hexadecimal escapes in a string literal, your string literals are written in UTF-8.
- Built-in embedding support (see Use Embedding for Composition in Chapter 7).
- Channels are one of the two things that set apart Go’s concurrency model.
- The
select
statement is the other thing that sets apart Go’s concurrency model.
Достоинства Go
Простота языка
За счёт своего объёма Go считается самым простым типизированным языком. В нём меньше пятидесяти ключевых слов, и разработчики следят за тем, чтобы новые элементы не появлялись без надобности. Например, версия 1.18, вышедшая в марте 2022-го, принесла первое изменение языка за 12 лет — новую конструкцию типизированных параметров.
Низкий риск ошибок
Из-за своей простоты и строгой типизации Go исключает большое количество ошибок на этапе разработки. К тому же в нём есть встроенный сборщик мусора, благодаря которому разработчики могут забыть про контроль и очистку памяти, которыми активно занимаются в C или C++.
Лёгкое чтение библиотек
Go полностью написан на Go. Любой разработчик, знающий этот язык, может с лёгкостью прочитать его стандартную библиотеку и понять, как всё работает. В самой библиотеке вы не встретите сложных моментов и даже сможете подсмотреть варианты обработки многопоточных сценариев.
Работа с горутинами и каналами
Горутины позволяют сделать любую функцию асинхронной. Другими словами, какую бы функцию ни написал разработчик, её можно запустить в фоновом режиме, и она будет работать. В то же время планировщик Go сам распределит нагрузку по ядрам, чтобы каждое из них было эффективно нагружено.
Запустить горутину так же просто, как вызвать функцию: нужно поставить ключевое слово go
перед вызовом.
Каналы позволяют передавать и синхронизировать данные между горутинами так, чтобы одни и те же байты не попадали в две разные горутины.
Для создания канала используется встроенная функция make
:
См. также Многопоточность в Go.
Самодостаточность
Go компилируется статически: когда разработчик написал программу и скомпилировал её, она помещается в один бинарник, который содержит все зависимости. Можно скомпилировать программу под нужную операционную систему и запускать её на любом компьютере с такой же ОС. Работа с Python или C++ потребует множества дополнительных файлов вроде интерпретаторов и библиотек.
Активное развитие
Ещё одна фишка Go — обратная совместимость версий, или Backward Compatibility Promise. Даже если вы писали код на старой версии языка, новая обработает его без проблем. Этим объясняется высокий adoption rate у новых версий Go.
Однозначность синтаксиса и форматирования
Язык наглядно указывает, как нужно форматировать код, а за счёт регламентированного расположения скобок и переносов практически все компании, использующие Go, имеют похожий стиль кода. Это позволяет быстро разобраться в чужом коде, к примеру, новым разработчикам. Кроме того, в Go нельзя объявить и не использовать переменную — возникнет ошибка.
Субъективные недостатки Go
Невозможно управлять памятью
Go управляет памятью автоматически. Встроенный сборщик мусора справляется хорошо, но в руках живого человека расход памяти сократится и будет более предсказуемым.
Неудобные моменты с библиотекой
В работе со стандартной библиотекой есть спорный момент — это язык шаблонизации и директивы форматирования дат. По сравнению с Java и C метод Go выглядит сомнительно:
Собственно, как и код:
Не хватает «батареек» из Python
Иногда в языке не хватает того, что в Python называется «батарейками», — отдельных элементов стандартной библиотеки, в которых есть всё для решения распространённых задач. В Go, например, нет встроенных базовых структур вроде decimal
и удобных функций для работы с массивами, что легко объяснить «подростковым» возрастом языка. Повзрослеет — и наберёт инструментов.
Нет тернарного оператора
В Go нет тернарного оператора, то есть возможности одной строкой проверить, является ли элемент true
или false
.
Например, так выглядит проверка на PHP:
Небольшая замусоренность
Этот недостаток связан с обратной совместимостью версий, преимуществом языка, которая способствует образованию некоторого мусора. Если разработчики понимают, что они плохо написали функцию или в стандартной библиотеке появилась новая единица, им приходится писать новые функции — похожие на старые, но с новыми фичами. Получается, что в Go можно встретить функции-близнецы, которые делают похожие вещи, имеют одинаковые имена, при этом от старой функции вы не можете избавиться, потому что где-то находится связанный с нею код.
Go Proverbs
В Go, как и везде в IT, действуют шаманские заклинания. Самые важные собраны — в основном со слов Роба Пайка — на особой страничке. Вот их вольный перевод:
- Избегайте коммуникаций через общую, разделённую память. Наоборот, делитесь данными в памяти через сообщения.
- Конкурентность и параллелизм — это не одно и то же.
- Каналы для взаимодействия, мьютексы для разобщения.
- Чем сложнее интерфейс, тем ненадёжней абстракция.
- Нулевые значения полезны не меньше других.
- Пустой интерфейс
interface{}
не о многом скажет.- У всех есть свой годный стиль форматирования кода, стандартное форматирование
gofmt
— годное для всех.- Копирование лучше зависимостей.
- Защищай системные вызовы в коде тегами сборки.
- Защищай кросс-вызовы cgo к коду C тегами сборки.
- Cgo — это не Go.
- Применяя пакет
unsafe
, не рассчитывай на какие-либо гарантии.- Лучше ясно, чем красиво.
- Интроспекция ясной не бывает.
- Значения ошибок — это тоже значения.
- Недостаточно отлавливать ошибки, нужно их обрабатывать.
- Полируй архитектуру, внятно называй компоненты, документируй детали.
- Документация — для пользователей.
- Не паникуй.
📂 Go | Последнее изменение: 11.08.2024 23:15
Link to original
Hello, Go
📂 Go | Последнее изменение: 24.08.2024 10:52