Краткий справочник по 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 )
Способы импорта других файлов
- Импорт по относительному пути: импортируйте другие файлы относительными путями. Подходит для ссылок на другие файлы в том же проекте. Например,
import "./utils"импортирует файлutilsтекущего проекта. - Импорт по абсолютному пути: импортируйте другие файлы абсолютными путями. Подходит для файлов в других проектах или библиотеках. Например,
import "github.com/example/package"импортирует файлы пакетаgithub.com/example/package. - Импорт стандартной библиотеки: язык Go предоставляет много стандартных библиотек, которые можно использовать напрямую. Например,
import "fmt"импортирует пакетfmtиз стандартной библиотеки. - Импорт с псевдонимом: можно задать псевдонимы импортированным пакетам или файлам, чтобы использовать более короткие имена. Например,
import utils "github.com/example/package"задаёт псевдонимutilsдляgithub.com/example/package, после чего к содержимому обращаются черезutils. - Импорт с пустым идентификатором: иногда нужно только выполнить функцию
initфайла, не используя остальное содержимое. Тогда импортируйте с пустым идентификатором_. Например,import _ "github.com/example/package"выполнитinitпакетаgithub.com/example/package, но остальное содержимое в коде использоваться не будет. - Импорт с оператором точка может сделать код короче, но также снизить читаемость.
Часто используемые 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.
Обновлено