Введение в Go за пять минут
January 25, 2021
Я около пяти лет программирую на го, из них последние три в основном на нём. Со всей ответственностью могу заявить, что это один самых классных языков программирования на текущий момент. А с приходом второй версии он станет ещё лучше. Я предлагаю познакомиться с этим языком от Google всего за 5 минут.
В 2007 году ни один из существующих языков не был достаточно хорош для проблем, с которыми столкнулся Google. Трое из сотрудников, Кен Томпсон, Роб Пайк и Роберт Грисемер зарезервировали переговорку, чтобы обсудить возможные варианты. И чтобы решить проблемы Google, они просто решили создать новый язык. И с их огромным опытом в программировании они могли это сделать. Потому что да, эти ребята не стажёры. Они помогли создать язык C, Unix и даже UTF-8. Мы говорим о настоящих бородатых программистах (хоть и без свитеров).
Они хотели трёх вещей: чрезвычайно быструю компиляцию, эффективное исполнение и очень простой в использовании язык. Никто не поспорит, что плюсы (которые С++) во многом хороши, особенно с точки зрения производительности, но слишком сложны в использовании и слишком долго компилируются. Java компилится значительно быстрее, но всё же слишком сложная для использования (энтепрайзность во всей красе). Python прост и лаконичен, но слишком уж нетороплив. У всех языков есть какой-то фатальный недостаток для наших трёх легендарных программистов. И именно для решения всех трёх проблем разом был придуман Go.
В 2009 году язык был публично объявлен, а в 2012 году в интернете появился первый релиз. Go — это компилируемый и сильно типизированный язык программирования. С точки зрения синтаксиса, он крайне похож на C. Обычно компиляция даёт отличную производительность, но тратит время разработчиков.
Но не с Go. Компиляция практически мгновенная. Таким образом, мы получаем типизацию и скорость компилируемого языка со скоростью разработки на интерпретируемом языке.
После компиляции Go генерирует один файл. Этот файл содержит весь код и может быть использован без установки рантаймов или компиляторов, просто запускается. Туда же можно засунуть и статические файлы. Это значительно упрощает развёртывание. А также Go является многопарадигменным языком. Можно писать как в процедурном, так и объектно-ориентированном стиле. Объектно ориентированный подход отличается от мейнстримовых ООП языков, но его более чем хватает для задач любой сложности. У го также есть сборщик мусора, который в очередной раз уменьшает сложность для разработчика. На го также невероятно просто писать многопоточный код благодаря его абстракциям горутин и каналов. Наконец, многие винят го в недостатке синтаксического сахара и некоторых возможностей, но это был осознанный выбор создателей языка. Цель состоит в том, чтобы никто не терялся, когда натыкается на код, который он не знает. Единообразие и простота поставлены во главу угла. Начнём знакомство с го примером из официального руководства. Дальше мы будем его модифицировать, но начнём с самой простой программы.
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello world")
}
Да, стандартный Hello World. Каждая программа состоит из пакетов, а выполнение начинается в пакете mail. Другие пакеты Go можно импортировать с помощью “import”. Здесь мы импортируем fmt, который позволит нам распечатать Hello World в основной функции исполнения main (). Довольно просто, не так ли?
package main
import (
"fmt"
)
func add(x, y int) int {
return x + y
}
func main() {
i, j := 1, 2
fmt.Println(add(i, j))
}
Теперь мы добавляем функцию и, как видите, она строготипизированная. Мы задаем как типа для параметров x и y, так и возвращаемое значение. Затем в основной функции мы создаём две переменные, которые инициализируем напрямую. Затем мы выводим результат первой функции через fmt. Обратите внимание, что если бы я не использовал переменные i и j, компилятор Go сразу начал ругаться.
Как я уже говорил, объектно-ориентированный подход может казаться непривычным. Нет никаких классов, но есть структуры и методы, связанные с ними. Интерфейсы реализованы неявно. Привет «утиной типизации» из питона, типу достаточно иметь все методы интерфейса, чтобы соответствовать ему, это сбивает с толку всяких джавистов, рассмотрим подробнее.
package main
import (
"fmt"
)
type Developer interface {
Code() string
}
type GoDeveloper struct {
}
func (gd GoDeveloper) Code() string {
return "go code"
}
func main() {
var developer Developer
developer = GoDeveloper{}
fmt.Println(developer.Code())
}
Наконец, давайте посмотрим, как выглядят горутины.
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("hello")
say("world")
}
Концепция лёгких потоков существует и в других языках, но именно в го горутины являются одной из самых крутых фич. Это функции, которые могут быть запущены параллельно с другими функциями. Они похожи на потоки операционной системы, но они значительно более легковесны. Горутины общаются друг с другом по каналам.
Люди часто используют имя Голанг для обозначения Го. Название происходит от официального сайта golang.com. Домен go.com уже был занят диснеевским сайтом. У Google не было выбора, и теперь имя Golang везде. Обратите внимание, что Google поддерживает го, но язык полностью открытый.
В любом случае, это не остановило весь мир от использования Голанга. Очевидно, что его активно используют в гугле. Докер полностью написан на Голанге. Он используется в производстве на Amazon, IBM, Netflix, Facebook и даже DigitalOcean. И прошло уже более 10 лет, так что экосистема успела развиться. И теперь используют практически во всех крупных компаниях для самых разных применений.