справочник
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 |