Модуль
Урок 9~15 минут
Пакет fmt: форматирование вывода
Семейство функций fmt
Пакет fmt — главный инструмент вывода в Go. Все функции делятся на три группы:
| Функция | Куда пишет | Возвращает |
|---|---|---|
Print, Println, Printf | os.Stdout | (n int, err error) |
Fprint, Fprintln, Fprintf | io.Writer (любой) | (n int, err error) |
Sprint, Sprintln, Sprintf | строка | string |
Errorf | строка | error |
go
// Print — без форматирования, добавляет пробел между аргументами если нет строк рядом
fmt.Print("Hello", "World") // HelloWorld
fmt.Print(1, 2, 3) // 1 2 3 ← пробелы между числами
// Println — добавляет пробелы между всеми и \n в конце
fmt.Println("Hello", "World") // Hello World\n
// Printf — форматирование через глаголы
fmt.Printf("Привет, %s! Тебе %d лет.\n", "Alice", 30)
// Sprintf — возвращает строку
s := fmt.Sprintf("Координаты: (%.2f, %.2f)", 1.5, 2.7)Форматные глаголы
Глаголы начинаются с %. Вот самые важные:
Общие — работают с любым типом
go
fmt.Printf("%v", 42) // 42 — значение по умолчанию
fmt.Printf("%v", true) // true
fmt.Printf("%v", []int{1,2}) // [1 2]
fmt.Printf("%v", struct{ X, Y int }{1, 2}) // {1 2}
fmt.Printf("%+v", struct{ X, Y int }{1, 2}) // {X:1 Y:2} ← имена полей
fmt.Printf("%#v", struct{ X, Y int }{1, 2}) // struct { X int; Y int }{X:1, Y:2} ← Go-синтаксис
fmt.Printf("%T", 42) // int — тип переменной
fmt.Printf("%T", []string{}) // []stringЦелые числа
go
n := 255
fmt.Printf("%d", n) // 255 — десятичный
fmt.Printf("%b", n) // 11111111 — двоичный
fmt.Printf("%o", n) // 377 — восьмеричный
fmt.Printf("%x", n) // ff — hex, строчные
fmt.Printf("%X", n) // FF — hex, заглавные
fmt.Printf("%c", 65) // A — Unicode символ
fmt.Printf("%q", 65) // 'A' — символ в кавычкахЧисла с плавающей точкой
go
f := 3.14159265
fmt.Printf("%f", f) // 3.141593 — с 6 знаками по умолчанию
fmt.Printf("%.2f", f) // 3.14 — 2 знака после запятой
fmt.Printf("%.0f", f) // 3 — без дробной части
fmt.Printf("%e", f) // 3.141593e+00 — научная нотация
fmt.Printf("%g", f) // 3.14159265 — компактный (убирает нули)Строки
go
s := "Hello"
fmt.Printf("%s", s) // Hello — строка
fmt.Printf("%q", s) // "Hello" — строка в двойных кавычках
fmt.Printf("%x", s) // 48656c6c6f — hex-представление байтУказатели
go
x := 42
fmt.Printf("%p", &x) // 0xc0000b4008 — адрес в памятиШирина и точность
%[флаги][ширина][.точность]глагол
Ширина — минимальное количество символов в выводе:
go
fmt.Printf("%10d", 42) // 42 (10 символов, правое выравнивание)
fmt.Printf("%-10d|", 42) // 42 | (левое выравнивание через -)
fmt.Printf("%010d", 42) // 0000000042 (заполнить нулями)Точность — количество знаков после запятой для float, максимальная длина для строк:
go
fmt.Printf("%.3f", 3.14159) // 3.142
fmt.Printf("%8.3f", 3.14159) // 3.142 (ширина 8, точность 3)
fmt.Printf("%.5s", "Hello World") // Hello (первые 5 символов)Интерфейс Stringer
Если тип реализует метод String() string, fmt вызовет его автоматически:
go
type Direction int
const (
North Direction = iota
South
East
West
)
func (d Direction) String() string {
return [...]string{"Север", "Юг", "Восток", "Запад"}[d]
}
dir := North
fmt.Println(dir) // Север ← вызвался String()
fmt.Printf("%v\n", dir) // Север
fmt.Printf("%d\n", dir) // 0 ← форсируем int-выводErrorf и обёртка ошибок
fmt.Errorf создаёт ошибку с форматированием. С %w можно обернуть существующую ошибку:
go
import (
"errors"
"fmt"
)
var ErrNotFound = errors.New("not found")
func getUser(id int) error {
return fmt.Errorf("getUser(%d): %w", id, ErrNotFound)
}
err := getUser(42)
fmt.Println(err) // getUser(42): not found
fmt.Println(errors.Is(err, ErrNotFound)) // true — обёртка прозрачнаСоветы по выбору глагола
go
// Универсальный совет: при отладке используй %v и %T
fmt.Printf("%T %v\n", anything, anything)
// Для структур %+v показывает поля с именами
fmt.Printf("%+v\n", myStruct)
// Для точного контроля формата — явный глагол
fmt.Printf("%.2f", price) // деньги всегда с фиксированной точностью
fmt.Printf("%x", bytes) // байты всегда в hex
// Для логирования — log пакет, не fmt
import "log"
log.Printf("server started on port %d", port) // добавит дату и времяМодуль 2 завершён. Ты знаешь все базовые типы Go, управляющие конструкции, константы и форматирование. В следующем модуле разберём функции — variadic args, замыкания и defer.
%v — универсальный глагол. Если не знаешь какой использовать — используй %v. Для отладки %+v покажет имена полей структуры, а %#v — полный Go-синтаксис.
🎯
Миссия 1 из 5
Какой форматный глагол выводит значение в двоичной системе?