Заметки по Go

справочник

Go: компактный конспект

Личные заметки по языку — то, к чему приходится возвращаться. Без претензии на полноту; за исчерпывающим — к спецификации и pkg.go.dev.

Основы

Программа на Go — это пакеты. Точка входа — функция main в пакете main. Компиляция даёт один статический бинарник без внешних зависимостей.

package main

import "fmt"

func main() {
    fmt.Println("Hello, мир")
}

Переменные объявляют через var либо коротким := внутри функций. Неиспользуемая переменная или импорт — ошибка компиляции, а не предупреждение.

var n int = 42       // с явным типом
m := 3.14            // тип выводится: float64
const Pi = 3.14159   // константа

Типы и структуры

Составной тип — struct. Методы объявляются с получателем; указательный получатель нужен, чтобы менять значение.

type Point struct {
    X, Y int
}

func (p Point) Add(q Point) Point {
    return Point{p.X + q.X, p.Y + q.Y}
}

func (p *Point) Shift(dx, dy int) {
    p.X += dx
    p.Y += dy
}

Ошибки — обычные значения, а не исключения. Идиома — проверять их сразу:

f, err := os.Open("data.txt")
if err != nil {
    return fmt.Errorf("открыть файл: %w", err)
}
defer f.Close()

Интерфейсы

Интерфейс задаёт набор методов. Тип удовлетворяет ему неявно — достаточно реализовать методы, никаких implements. Отсюда — слабая связанность.

type Stringer interface {
    String() string
}

type Celsius float64

func (c Celsius) String() string {
    return fmt.Sprintf("%.1f°C", float64(c))
}

Пустой интерфейс any (он же interface{}) принимает любое значение; обратно достаётся через type assertion или switch v := x.(type).

Встроенные типы — коротко

ТипЧто этоНулевое значение
boolлогическийfalse
int, int64целые0
float64с плавающей точкой0
stringнеизменяемая строка (UTF-8)""
[]Tсрезnil
map[K]Vассоциативный массивnil
chan Tканалnil