Модуль
1Hello, World!2Переменные в Go3Целые числа4Строки и руны5float64 и числа с плавающей точкой6if, switch, for7bool и логические операторы8Константы и iota9Пакет fmt: форматирование вывода← вы здесь
Урок 9~15 минут

Пакет fmt: форматирование вывода

Семейство функций fmt

Пакет fmt — главный инструмент вывода в Go. Все функции делятся на три группы:

ФункцияКуда пишетВозвращает
Print, Println, Printfos.Stdout(n int, err error)
Fprint, Fprintln, Fprintfio.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)
Print vs Println vs Printf vs Sprintf
Ctrl+Enter
1

Форматные глаголы

Глаголы начинаются с %. Вот самые важные:

Общие — работают с любым типом

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'       — символ в кавычках
Форматирование целых чисел
Ctrl+Enter
1

Числа с плавающей точкой

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 символов)
Ширина и выравнивание
Ctrl+Enter
1

Интерфейс 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-вывод
Интерфейс Stringer
Ctrl+Enter
1

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 — обёртка прозрачна
fmt.Errorf и обёртка ошибок
Ctrl+Enter
1

Советы по выбору глагола

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-синтаксис.
Пакет fmt — форматированиеimport "fmt"

Выберите тип значения и измените его — все глаголы форматирования обновятся автоматически:

Значение:
%vзначение по умолчанию
65
%dдесятичное целое
65
%bдвоичное
1000001
%oвосьмеричное
101
%xhex, строчные
41
%Xhex, заглавные
41
%cсимвол Unicode
A
%qэкранированный символ
'A'
%Tтип значения
int
// Использование в fmt.Printf:
fmt.Printf("%v %d", value, value)
🎯
Миссия 1 из 5
Какой форматный глагол выводит значение в двоичной системе?