Menu
Coddy logo textTech

Шпаргалка по Go

Последнее обновление

Hello World и структура программы

Каждая программа на Go находится в пакете; точка входа - func main в пакете main.

ОперацияСинтаксис
Объявление пакетаpackage main
Импорт пакетаimport "fmt"
Импорт нескольких пакетовimport (\n "fmt"\n "os"\n)
Точка входаfunc main() { ... }
Вывести строкуfmt.Println("Hello, World!")
Форматированный выводfmt.Printf("%d items\n", n)
Запустить файлgo run main.go
Собрать бинарникgo build

Переменные и типы

Go статически типизирован, но может выводить типы через :=.

ОперацияСинтаксис
Объявить с типомvar age int = 30
Объявить с выводом типаvar name = "Ada"
Краткое объявлениеcount := 0
Несколько сразуx, y := 1, 2
Константаconst Pi = 3.14
Нулевые значения0, "", false, nil
Базовые типыint, float64, string, bool, byte, rune
Преобразование типаf := float64(i)

Управление потоком

В Go одно ключевое слово для циклов - for - и нет скобок вокруг условий.

ОперацияСинтаксис
If / elseif x > 0 { ... } else { ... }
If с инициализирующим операторомif v, ok := m[k]; ok { ... }
Цикл for (в стиле C)for i := 0; i < 10; i++ { ... }
Цикл в стиле whilefor x < 100 { ... }
Бесконечный циклfor { ... }
Range по слайсуfor i, v := range items { ... }
Switchswitch day { case 1: ...; default: ... }
Switch без выраженияswitch { case x > 0: ... }
Break / continuebreak, continue

Функции

Функции - значения первого класса и могут возвращать несколько результатов.

ОперацияСинтаксис
Базовая функцияfunc add(a int, b int) int { return a + b }
Общий тип параметровfunc add(a, b int) int { ... }
Несколько возвращаемых значенийfunc divmod(a, b int) (int, int) { return a / b, a % b }
Именованные возвращаемые значенияfunc split(sum int) (x, y int) { x = sum / 2; return }
Вариативная функцияfunc sum(nums ...int) int { ... }
Анонимная функцияf := func() { ... }
Замыканиеfunc counter() func() int { ... }
Defer (выполняется при возврате)defer file.Close()

Слайсы и массивы

Массивы имеют фиксированный размер; слайсы - динамические представления над массивами.

ОперацияСинтаксис
Массив фиксированного размераvar a [3]int
Литерал слайсаnums := []int{1, 2, 3}
Создать слайсs := make([]int, 0, 10)
Добавитьs = append(s, 4)
Длина / ёмкостьlen(s), cap(s)
Срез слайсаs[1:3]
Копированиеcopy(dst, src)
Переборfor i, v := range s { ... }

Мапы

Мапы - встроенные хеш-таблицы Go.

ОперацияСинтаксис
Создать мапуm := make(map[string]int)
Литерал мапыm := map[string]int{"a": 1, "b": 2}
Задать значениеm["c"] = 3
Получить значениеv := m["a"]
Проверить наличиеv, ok := m["x"]
Удалить ключdelete(m, "a")
Длинаlen(m)
Переборfor k, v := range m { ... }

Структуры и методы

Структуры группируют поля; методы привязывают поведение через получатель.

ОперацияСинтаксис
Определить структуруtype Point struct { X, Y int }
Создать экземплярp := Point{X: 1, Y: 2}
Доступ к полюp.X
Указатель на структуруp := &Point{1, 2}
Метод с получателем-значениемfunc (p Point) Dist() float64 { ... }
Метод с получателем-указателемfunc (p *Point) Move(dx int) { p.X += dx }
Встроенная структураtype Circle struct { Point; R int }
Теги структурыName string с тегом json:"name" в обратных кавычках

Интерфейсы

Интерфейсы реализуются неявно - подходит любой тип с нужными методами.

ОперацияСинтаксис
Определить интерфейсtype Shape interface { Area() float64 }
Реализация (неявная)func (c Circle) Area() float64 { ... }
Пустой интерфейс (any)var x interface{} или var x any
Утверждение типаs, ok := x.(string)
Type switchswitch v := x.(type) { case int: ... }
Интерфейс Stringerfunc (p Point) String() string { ... }

Горутины и каналы

Горутины - лёгкие потоки; каналы передают значения между ними.

ОперацияСинтаксис
Запустить горутинуgo doWork()
Создать каналch := make(chan int)
Буферизованный каналch := make(chan int, 5)
Отправить в каналch <- 42
Получить из каналаv := <-ch
Закрыть каналclose(ch)
Range по каналуfor v := range ch { ... }
Select по каналамselect { case v := <-ch: ...; default: ... }
Группа ожиданияvar wg sync.WaitGroup; wg.Add(1); wg.Wait()
Мьютексvar mu sync.Mutex; mu.Lock(); mu.Unlock()

Обработка ошибок

Go возвращает ошибки как значения - исключений нет.

ОперацияСинтаксис
Вернуть ошибкуfunc read() (string, error) { return "", err }
Проверить ошибкуif err != nil { return err }
Создать ошибкуerrors.New("not found")
Форматированная ошибкаfmt.Errorf("bad id %d", id)
Обернуть ошибкуfmt.Errorf("load: %w", err)
Развернуть / сопоставитьerrors.Is(err, os.ErrNotExist)
Сопоставить по типуerrors.As(err, &target)
Panic / recoverdefer func() { recover() }()

Синтаксис Go, который нужен чаще всего, на одной странице. Эта шпаргалка по Go - быстрый справочник по ядру языка: переменные и типы, слайсы и мапы, структуры и интерфейсы, а также горутины и каналы, благодаря которым Golang силён в конкурентности.

Всё здесь - стандартный Go, который компилируется официальным инструментарием. Копируйте нужное или попробуйте каждый фрагмент вживую в playground для Go - без установки.

Часто задаваемые вопросы по шпаргалке Go

Эта шпаргалка по Go бесплатна?
Да. Эта шпаргалка по Go полностью бесплатна, регистрация не требуется. Добавьте её в закладки и возвращайтесь, когда нужно посмотреть операцию со слайсом, паттерн работы с каналом или метод структуры.
В чём разница между := и var в Go?
var x = 0 объявляет переменную и работает где угодно, в том числе на уровне пакета. x := 0 - это краткое объявление переменной: оно одновременно объявляет и присваивает, выводит тип и может использоваться только внутри функции. Используйте var, когда нужен явный тип или переменная уровня пакета, и := для лаконичных локальных объявлений.
Что такое горутины и каналы?
Горутина - это лёгкий поток, управляемый рантаймом Go; вы запускаете её, написав go someFunc(). Каналы - типизированные каналы связи, которые позволяют горутинам безопасно общаться: одна горутина отправляет через ch <- v, а другая получает через <-ch. Вместе они образуют основную модель конкурентности Go, выраженную фразой "делитесь памятью через общение".
Можно ли практиковать Go онлайн?
Да. Откройте playground для Go, чтобы выполнить любой фрагмент из этой шпаргалки прямо в браузере - без установки инструментария Go. А если нужна структура, бесплатный интерактивный курс Go от Coddy шаг за шагом проведёт вас от переменных и слайсов до горутин и каналов.
Подходит ли эта шпаргалка для начинающих?
Да. Она построена от самых распространённых тем (переменные, управление потоком, функции) к продвинутым (горутины, каналы, обработка ошибок), так что верхние разделы можно использовать с первого дня и постепенно осваивать остальное.
Coddy programming languages illustration

Изучайте Go с Coddy

НАЧАТЬ