Полный справочник по пакету fmt в Go

Полное описание пакета fmt в Go с примерами применения и разными потоками вывода

Пакет 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