По-английски суслик — gopher. Автор оригинального изображения — иллюстратор и писатель Рене Френч, жена Роба Пайка, одного из создателей Go. Изначально она рисовала суслика для промоушена радиостанции WFMU в Нью-Джерси. Спустя несколько лет, когда стартовал проект#Go и понадобился маскот, Рене адаптировала рисунок гофера. Так суслик стал талисманом нового языка программирования.

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

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

Зачем миру понадобился ещё один язык?

Несмотря на то что Go — сравнительно молодой язык (первая версия появилась в 2009 году, а в 2012-м состоялся первый стабильный релиз), потребность в подобном языке возникла на рынке задолго до его создания.

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

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

  • Язык должен быть максимально простым для изучения. Действительно, синтаксис Go крайне прост, всего лишь несколько десятков ключевых слов и синтаксических конструкций. Простота языка обеспечивает не только лёгкость освоения, но и снижение количества неявных ошибок.
  • Управление памятью и сборка мусора. Выделение памяти в Go управляется компилятором в зависимости от контекста. Go автоматически определяет, где требуется разместить переменную — на стеке или в куче, что избавляет от многих ошибок и уязвимостей.
  • Безопасность. Управление памятью осуществляется планировщиком, в результате чего нельзя выйти за пределы массива.
  • Безопасные указатели. В Go отсутствует арифметика указателей, к которой привыкли пользователи С/С++. Указатель только может указывать на некоторый объект, нельзя создать указатель на произвольный объект памяти.
  • Реализация ООП без наследования уменьшает сложность программ.
  • Отсутствие механизма исключений — также намеренно. Это позволяет упростить отладку программ.
  • Быстрая компиляция, позволяющая оперативно выполнять разработку сложных программ.
  • Встроенный инструментарий тестирования, сетевые возможности.
  • Нет средств обобщённого программирования и перегрузки функций. Это позволяет как ускорить компиляцию, так и снизить количество ошибок.

Note

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

Go Facts

  • 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.
Link to original

Go Features

  • 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.
Link to original

Достоинства Go

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

За счёт своего объёма Go считается самым простым типизированным языком. В нём меньше пятидесяти ключевых слов, и разработчики следят за тем, чтобы новые элементы не появлялись без надобности. Например, версия 1.18, вышедшая в марте 2022-го, принесла первое изменение языка за 12 лет — новую конструкцию типизированных параметров.

Низкий риск ошибок

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

Лёгкое чтение библиотек

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

Работа с горутинами и каналами

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

Запустить горутину так же просто, как вызвать функцию: нужно поставить ключевое слово go перед вызовом.

func main() {
    go sleepyGopher() // Начало горутины
    time.Sleep(4 * time.Second) // Ожидание
} // Здесь все горутины останавливаются 

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

Для создания канала используется встроенная функция make:

c := make(chan int) 

См. также Многопоточность в Go.

Самодостаточность

Go компилируется статически: когда разработчик написал программу и скомпилировал её, она помещается в один бинарник, который содержит все зависимости. Можно скомпилировать программу под нужную операционную систему и запускать её на любом компьютере с такой же ОС. Работа с Python или C++ потребует множества дополнительных файлов вроде интерпретаторов и библиотек.

Активное развитие

Ещё одна фишка Go — обратная совместимость версий, или Backward Compatibility Promise. Даже если вы писали код на старой версии языка, новая обработает его без проблем. Этим объясняется высокий adoption rate у новых версий Go.

Однозначность синтаксиса и форматирования

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

Субъективные недостатки Go

Невозможно управлять памятью

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

Неудобные моменты с библиотекой

В работе со стандартной библиотекой есть спорный момент — это язык шаблонизации и директивы форматирования дат. По сравнению с Java и C метод Go выглядит сомнительно:

image

Собственно, как и код:

input := "2017-08-31"
layout := "2006-01-02"
t, _ := time.Parse(layout, input)
fmt.Println(t)                       // 2017-08-31 00:00:00 +0000 UTC
fmt.Println(t.Format("02-Jan-2006")) // 31-Aug-2017 

Не хватает «батареек» из Python

Иногда в языке не хватает того, что в Python называется «батарейками», — отдельных элементов стандартной библиотеки, в которых есть всё для решения распространённых задач. В Go, например, нет встроенных базовых структур вроде decimal и удобных функций для работы с массивами, что легко объяснить «подростковым» возрастом языка. Повзрослеет — и наберёт инструментов.

Нет тернарного оператора

В Go нет тернарного оператора, то есть возможности одной строкой проверить, является ли элемент true или false.

Например, так выглядит проверка на PHP:

$isAdmin = $user->role == "admin" ? true : false; 
var isAdmin bool
if user.Role == "admin" {
    isAdmin = true
} 

Небольшая замусоренность

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


Go Proverbs

#Go


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

  • Избегайте коммуникаций через общую, разделённую память. Наоборот, делитесь данными в памяти через сообщения.
  • Конкурентность и параллелизм — это не одно и то же.
  • Каналы для взаимодействия, мьютексы для разобщения.
  • Чем сложнее интерфейс, тем ненадёжней абстракция.
  • Нулевые значения полезны не меньше других.
  • Пустой интерфейс interface{} не о многом скажет.
  • У всех есть свой годный стиль форматирования кода, стандартное форматирование gofmt — годное для всех.
  • Копирование лучше зависимостей.
  • Защищай системные вызовы в коде тегами сборки.
  • Защищай кросс-вызовы cgo к коду C тегами сборки.
  • Cgo — это не Go.
  • Применяя пакет unsafe, не рассчитывай на какие-либо гарантии.
  • Лучше ясно, чем красиво.
  • Интроспекция ясной не бывает.
  • Значения ошибок — это тоже значения.
  • Недостаточно отлавливать ошибки, нужно их обрабатывать.
  • Полируй архитектуру, внятно называй компоненты, документируй детали.
  • Документация — для пользователей.
  • Не паникуй.

📂 Go | Последнее изменение: 11.08.2024 23:15

Link to original


Hello, Go

package main
 
import "fmt"
 
func main() {
    fmt.Println("Hello, Go")
} 

📂 Go | Последнее изменение: 24.08.2024 10:52