Шпаргалка по 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 / else | if x > 0 { ... } else { ... } |
| If с инициализирующим оператором | if v, ok := m[k]; ok { ... } |
| Цикл for (в стиле C) | for i := 0; i < 10; i++ { ... } |
| Цикл в стиле while | for x < 100 { ... } |
| Бесконечный цикл | for { ... } |
| Range по слайсу | for i, v := range items { ... } |
| Switch | switch day { case 1: ...; default: ... } |
| Switch без выражения | switch { case x > 0: ... } |
| Break / continue | break, 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 switch | switch v := x.(type) { case int: ... } |
| Интерфейс Stringer | func (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 / recover | defer func() { recover() }() |
Синтаксис Go, который нужен чаще всего, на одной странице. Эта шпаргалка по Go - быстрый справочник по ядру языка: переменные и типы, слайсы и мапы, структуры и интерфейсы, а также горутины и каналы, благодаря которым Golang силён в конкурентности.
Всё здесь - стандартный Go, который компилируется официальным инструментарием. Копируйте нужное или попробуйте каждый фрагмент вживую в playground для Go - без установки.
Часто задаваемые вопросы по шпаргалке Go
Эта шпаргалка по Go бесплатна?
В чём разница между := и var в Go?
var x = 0 объявляет переменную и работает где угодно, в том числе на уровне пакета. x := 0 - это краткое объявление переменной: оно одновременно объявляет и присваивает, выводит тип и может использоваться только внутри функции. Используйте var, когда нужен явный тип или переменная уровня пакета, и := для лаконичных локальных объявлений.Что такое горутины и каналы?
go someFunc(). Каналы - типизированные каналы связи, которые позволяют горутинам безопасно общаться: одна горутина отправляет через ch <- v, а другая получает через <-ch. Вместе они образуют основную модель конкурентности Go, выраженную фразой "делитесь памятью через общение".