Skip to Content
БлогКраткий справочник по Golang

Краткий справочник по Golang

Как использовать коллекции

Как использовать срезы

// Особенности: изменяемые, передача по ссылке, размещение в куче a := []int{1,2,3,4,5} // сокращённая запись и инициализация // Можно также указать индекс как заполнитель a := []int{0:1,4:3} // Добавить a = append(a, 6) // Удалить // Индекс элемента для удаления index := 2 // Удалить элемент slice = append(slice[:index], slice[index+1:]...) // Это также слияние массивов // Изменение и чтение как у массива

О длине и ёмкости срезов

// Length (длина) — число элементов, которые срез содержит сейчас. // Capacity (ёмкость) — размер подлежащего массива, то есть верхний предел числа элементов, которые срез может вместить. a := make([]byte, 5, 10) // Срез a может вместить до 10 элементов byte, но сейчас в нём только 5. // Ёмкость можно опустить a := make([]byte, 5) // Пояснение синтаксиса a[b:c] => // b — текущий индекс; если пусто, индекс равен 0 // c — текущий индекс; если пусто, индекс равен len(a) s := x[:] // срез s указывает на память массива x; изменение s влияет и на x

Как итерировать срезы

for k,v := range a {} for _,v := range a {} // индекс не нужен for k := range a {} // нужен только индекс for range time.Tick(time.Second) {} // не нужно ни то ни другое

Как использовать массивы

// Особенности: фиксированный размер, передача по значению, размещение на стеке a := [5]int{1,2,3,4,5} // Добавлять и удалять нельзя // Изменить a[3] = 6 // Прочитать a[3]

Как использовать switch

switch a { case "a": // todo case "b", "c": // совпадает с b или c // todo default: // todo } // Можно также предварить инструкцией switch a:=1; a { ... }

Как использовать циклы for

for {} // эквивалент while true for a < 19 {} // эквивалент while a < 19 for a := 10; a<99; a++ {} // обычное использование // Также поддерживаются break и continue с внешними метками here: for i := 0; i < 2; i++ { for j := i + 1; j < 3; j++ { if i == 0 { continue here } fmt.Println(j) if j == 2 { break } } } there: for i := 0; i < 2; i++ { for j := i + 1; j < 3; j++ { if j == 1 { continue } fmt.Println(j) if j == 2 { break there } } }

Как использовать конструкцию if

if a > 0 {} // Можно добавить дополнительную инструкцию и завершить точкой с запятой if a := b+c; a > 0 {}

О пакетах и ограничениях по умолчанию

Объявление package ставится в самое начало каждого исходного файла Go (кроме комментариев). Исполняемые файлы находятся в пакете main. Соглашение: имя пакета == последний сегмент пути импорта (путь math/rand => имя rand). Идентификаторы с заглавной буквы: экспортируемые, видны другим пакетам. Идентификаторы со строчной буквы: закрытые, другим пакетам не видны.

Как объявлять функции

func a() {} func a(b int){} func a(b, c int){} // несколько одного типа func a() string {} // Возвращаемое значение func a() (int,string){ return 1, "1" } // Идентификатор возврата, достаточно просто return func a() (b int, c string){ b = 1 c = "1" return }

Передача функций и замыкания

// Используется как параметр add := func(a,b)int{ return a+b } // Используется как возвращаемое значение func wrapAdd() (add func() int) { c := 1 add = func() int { return c } return }

Вариативные функции

func a(args ...int) int { return 1 }

Как объявлять переменные

var a int = 1 a := 1 const a = "1"

Приёмы iota

  • Автоинкремент значений перечисления

    const ( Red = iota // 0 Green // 1 Blue // 2 )
  • Битовые операции для констант-флагов

    const ( FlagNone = 0 // 0 FlagA = 1 << iota // 1 FlagB = 1 << iota // 2 FlagC = 1 << iota // 4 )
  • Пропуск ненужных значений

    const ( _ = iota // пропустить первое значение перечисления January = 1 + iota // 1 February // 2 March // 3 )

Способы импорта других файлов

  1. Импорт по относительному пути: импортируйте другие файлы относительными путями. Подходит для ссылок на другие файлы в том же проекте. Например, import "./utils" импортирует файл utils текущего проекта.
  2. Импорт по абсолютному пути: импортируйте другие файлы абсолютными путями. Подходит для файлов в других проектах или библиотеках. Например, import "github.com/example/package" импортирует файлы пакета github.com/example/package.
  3. Импорт стандартной библиотеки: язык Go предоставляет много стандартных библиотек, которые можно использовать напрямую. Например, import "fmt" импортирует пакет fmt из стандартной библиотеки.
  4. Импорт с псевдонимом: можно задать псевдонимы импортированным пакетам или файлам, чтобы использовать более короткие имена. Например, import utils "github.com/example/package" задаёт псевдоним utils для github.com/example/package, после чего к содержимому обращаются через utils.
  5. Импорт с пустым идентификатором: иногда нужно только выполнить функцию init файла, не используя остальное содержимое. Тогда импортируйте с пустым идентификатором _. Например, import _ "github.com/example/package" выполнит init пакета github.com/example/package, но остальное содержимое в коде использоваться не будет.
  6. Импорт с оператором точка может сделать код короче, но также снизить читаемость.

Часто используемые CLI-команды

  • go build: компилирует код Go и создаёт исполняемые файлы. Например, go build main.go скомпилирует main.go и создаст исполняемый файл.
  • go run: компилирует и запускает код Go. Например, go run main.go скомпилирует и сразу запустит main.go.
  • go test: запускает модульные тесты Go. Командой go test можно автоматически выполнить тестовые файлы проекта и вывести результаты.
  • go get: загружает и устанавливает сторонние пакеты зависимостей. Например, go get github.com/example/package загрузит и установит зависимость github.com/example/package.
  • go mod init: инициализирует управление модулями проекта Go. Выполнив go mod init, можно создать новый файл go.mod для управления зависимостями.
  • go mod tidy: автоматически очищает неиспользуемые зависимости проекта. go mod tidy проверяет зависимости и удаляет больше не нужные.
  • go mod vendor: копирует зависимости проекта в каталог vendor. Командой go mod vendor можно скопировать все зависимости в проект для офлайн-сборки и развёртывания.
  • go doc: просмотр документации кода Go. Например, go doc fmt.Println покажет документацию функции Println пакета fmt.
Обновлено