Полный справочник по пакету fmt в Go
Полное описание пакета fmt в Go с примерами применения и разными потоками вывода
Categories:
Пакет fmt
(format) — один из самых часто используемых в Go. Он предоставляет функции для форматированного ввода/вывода, аналогичные printf
и scanf
в C.
1. Основные функции вывода
1.1. Вывод в стандартный поток (stdout)
fmt.Print("Hello, ", "World!") // Без перевода строки
fmt.Println("Hello, World!") // С переводом строки
fmt.Printf("Name: %s, Age: %d\n", "Alice", 25) // Форматированный вывод
1.2. Вывод в строку (Sprint
, Sprintf
, Sprintln
)
s1 := fmt.Sprint("Hello, ", "World!") // => "Hello, World!"
s2 := fmt.Sprintf("Name: %s, Age: %d", "Bob", 30) // => "Name: Bob, Age: 30"
s3 := fmt.Sprintln("Line with newline") // => "Line with newline\n"
1.3. Вывод в файл или io.Writer
(Fprint
, Fprintf
, Fprintln
)
file, _ := os.Create("output.txt")
fmt.Fprint(file, "Hello, file!") // Запись в файл
fmt.Fprintf(file, "Value: %v", 42) // Форматированная запись
fmt.Fprintln(file, "End of line") // Запись с переводом строки
2. Форматирование вывода (Printf
, Sprintf
, Fprintf
)
2.1. Основные спецификаторы
Спецификатор | Описание | Пример (%v ) |
Вывод (42 ) |
---|---|---|---|
%v |
Универсальный формат | %v |
42 |
%+v |
С полями структур | %+v |
{X:42} |
%#v |
Go-синтаксис | %#v |
42 (int) |
%T |
Тип переменной | %T |
int |
%% |
Символ % |
%% |
% |
2.2. Форматирование разных типов данных
// Целые числа
fmt.Printf("%d %b %o %x %X\n", 42, 42, 42, 42, 42) // 42 101010 52 2a 2A
// Вещественные числа
fmt.Printf("%f %.2f %e %g\n", 3.1415, 3.1415, 3.1415, 3.1415) // 3.141500 3.14 3.141500e+00 3.1415
// Строки и символы
fmt.Printf("%s %q %c\n", "Go", "Go", 'G') // Go "Go" G
// Логические значения
fmt.Printf("%t\n", true) // true
2.3. Ширина и точность
// Ширина поля (выравнивание)
fmt.Printf("|%5d|%-5d|\n", 42, 42) // | 42|42 |
// Точность для float
fmt.Printf("%.2f\n", 3.141592) // 3.14
// Комбинация ширины и точности
fmt.Printf("%10.2f\n", 3.141592) // " 3.14"
2.4. Позиционные аргументы
fmt.Printf("%[2]d %[1]d\n", 10, 20) // 20 10
3. Ввод данных (Scan
, Scanf
, Scanln
)
3.1. Чтение из стандартного ввода (stdin)
var name string
var age int
fmt.Print("Enter name and age: ")
fmt.Scan(&name, &age) // Читает до пробела/перевода строки
fmt.Printf("Hello, %s (%d)\n", name, age)
3.2. Форматированный ввод (Scanf
)
var a, b int
fmt.Scanf("%d,%d", &a, &b) // Ввод "10,20" → a=10, b=20
3.3. Чтение строки (Scanln
)
var input string
fmt.Scanln(&input) // Читает до перевода строки
3.4. Чтение из строки (Sscan
, Sscanf
, Sscanln
)
var x, y int
fmt.Sscanf("10 20", "%d %d", &x, &y) // x=10, y=20
3.5. Чтение из файла (Fscan
, Fscanf
, Fscanln
)
file, _ := os.Open("input.txt")
var value int
fmt.Fscanf(file, "%d", &value) // Чтение числа из файла
4. Дополнительные функции
4.1. Форматирование ошибок (Errorf
)
err := fmt.Errorf("invalid value: %d", 42) // Создает error
4.2. Вывод в io.Writer
с форматированием (Fprintf
)
var buf bytes.Buffer
fmt.Fprintf(&buf, "Value: %d", 42) // Запись в буфер
4.3. Сканирование из io.Reader
(Fscanf
)
reader := strings.NewReader("100")
var num int
fmt.Fscanf(reader, "%d", &num) // num = 100
5. Полезные примеры
5.1. Вывод таблицы
fmt.Printf("|%-10s|%10s|\n", "Name", "Age")
fmt.Printf("|%-10s|%10d|\n", "Alice", 25)
fmt.Printf("|%-10s|%10d|\n", "Bob", 30)
Вывод:
|Name | Age|
|Alice | 25|
|Bob | 30|
5.2. Чтение нескольких значений
var a, b int
fmt.Print("Enter two numbers: ")
fmt.Scan(&a, &b)
fmt.Println("Sum:", a+b)
5.3. Форматирование JSON
data := map[string]interface{}{"name": "Alice", "age": 25}
jsonStr := fmt.Sprintf("%+v", data) // {"age":25, "name":"Alice"}
Дополнительный раздел: Форматирование различных типов данных в Go
1. Форматирование базовых типов (Printf
, Sprintf
, Fprintf
)
1.1. Целые числа (int
, int32
, int64
, uint
)
num := 42
fmt.Printf("Десятичное: %d\n", num) // 42
fmt.Printf("Двоичное: %b\n", num) // 101010
fmt.Printf("Восьмеричное: %o\n", num) // 52
fmt.Printf("Шестнадцатеричное (нижний регистр): %x\n", num) // 2a
fmt.Printf("Шестнадцатеричное (верхний регистр): %X\n", num) // 2A
fmt.Printf("С ведущими нулями: %05d\n", num) // 00042
1.2. Вещественные числа (float32
, float64
)
pi := 3.1415926535
fmt.Printf("По умолчанию: %f\n", pi) // 3.141593
fmt.Printf("С точностью 2 знака: %.2f\n", pi) // 3.14
fmt.Printf("Экспоненциальная запись: %e\n", pi) // 3.141593e+00
fmt.Printf("Автовыбор формата: %g\n", pi) // 3.1415926535
fmt.Printf("Ширина 10 символов: %10.2f\n", pi) // " 3.14"
1.3. Строки (string
) и символы (rune
)
str := "Hello"
fmt.Printf("Строка: %s\n", str) // Hello
fmt.Printf("Строка в кавычках: %q\n", str) // "Hello"
fmt.Printf("Ширина 10 символов: %10s\n", str) // " Hello"
fmt.Printf("Символ: %c\n", 'A') // A
fmt.Printf("Юникод-символ: %U\n", 'Я') // U+042F
1.4. Логические значения (bool
)
flag := true
fmt.Printf("Логическое: %t\n", flag) // true
1.5. Указатели (*int
, *string
)
x := 42
ptr := &x
fmt.Printf("Указатель: %p\n", ptr) // 0xc0000180a8
fmt.Printf("Значение по указателю: %v\n", *ptr) // 42
2. Форматирование структур (struct
) и массивов (slice
, array
)
2.1. Вывод структуры
type Person struct {
Name string
Age int
}
p := Person{"Alice", 25}
fmt.Printf("Универсальный формат: %v\n", p) // {Alice 25}
fmt.Printf("С полями: %+v\n", p) // {Name:Alice Age:25}
fmt.Printf("Go-синтаксис: %#v\n", p) // main.Person{Name:"Alice", Age:25}
2.2. Форматирование слайсов и массивов
arr := [3]int{1, 2, 3}
slice := []string{"a", "b", "c"}
fmt.Printf("Массив: %v\n", arr) // [1 2 3]
fmt.Printf("Слайс: %v\n", slice) // [a b c]
fmt.Printf("Go-синтаксис: %#v\n", slice) // []string{"a", "b", "c"}
3. Форматирование с помощью fmt.Append
(Go 1.19+)
Функция fmt.Append
позволяет форматировать данные и добавлять их в слайс байт ([]byte
).
3.1. Базовое использование
buf := []byte("Данные: ")
buf = fmt.Append(buf, 42, " ", true)
fmt.Println(string(buf)) // Данные: 42 true
3.2. Форматированный вывод (Appendf
)
buf := []byte("Число: ")
buf = fmt.Appendf(buf, "%05d", 42)
fmt.Println(string(buf)) // Число: 00042
3.3. Добавление в буфер (bytes.Buffer
)
var buffer bytes.Buffer
buffer.WriteString("Строка: ")
fmt.Fprintf(&buffer, "%q", "Hello")
fmt.Println(buffer.String()) // Строка: "Hello"
4. Специальные форматы
4.1. Вывод времени (time.Time
)
t := time.Now()
fmt.Printf("RFC3339: %v\n", t.Format(time.RFC3339)) // 2024-03-15T14:20:10Z
fmt.Printf("Кастомный формат: %02d.%02d.%04d\n", t.Day(), t.Month(), t.Year()) // 15.03.2024
4.2. Форматирование JSON
data := map[string]any{"name": "Alice", "age": 25}
jsonStr := fmt.Sprintf("%+v", data) // map[age:25 name:Alice]
4.3. Ширина и выравнивание
fmt.Printf("|%10s|\n", "left") // | left|
fmt.Printf("|%-10s|\n", "right") // |right |
fmt.Printf("|%10.2f|\n", 3.1415) // | 3.14|
5. Полезные примеры
5.1. Таблица с выравниванием
fmt.Printf("|%-10s|%10s|\n", "Name", "Age")
fmt.Printf("|%-10s|%10d|\n", "Alice", 25)
fmt.Printf("|%-10s|%10d|\n", "Bob", 30)
Вывод:
|Name | Age|
|Alice | 25|
|Bob | 30|
5.2. Форматирование ошибок
err := fmt.Errorf("ошибка: значение %d недопустимо", 100)
fmt.Println(err) // ошибка: значение 100 недопустимо
5.3. Чтение и запись в файл
// Запись
file, _ := os.Create("data.txt")
fmt.Fprintf(file, "Число: %d", 42)
file.Close()
// Чтение
file, _ = os.Open("data.txt")
var num int
fmt.Fscanf(file, "Число: %d", &num)
fmt.Println(num) // 42