Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: Зачем тестировщику нужна безопасность? - 16.04

menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V8013. Incorrect format. A different number of format items is expected.

03 Апр 2026

Анализатор обнаружил ошибку при использовании функции форматного ввода/вывода. Количество переданных аргументов не соответствует ожидаемому согласно форматной строке.

Рассмотрим несколько примеров, на которые анализатор выдаёт предупреждения.

Пример N1:

fmt.Printf("Name: %s; Age: %d", "Donald")

Предполагается, что в строку форматирования будут подставлены имя (%s) и возраст (%d), однако аргумент, соответствующий возрасту, отсутствует. В результате в stdout выведется строка, содержащая ошибку.

Чтобы её исправить, следующим аргументом нужно передавать возраст:

fmt.Printf("Name: %s; Age: %d", "Donald", 13)

Пример N2:

fmt.Printf("Name: %s", "Donald", 13)

Здесь в функцию передаётся больше аргументов, чем подразумевалось. Для аргумента 13 нет места подстановки. В результате в stdout также выведется ошибочная строка.

Для исправления уберём лишний аргумент:

fmt.Printf("Name: %s", "Donald")

С помощью передаваемых аргументов можно задавать ширину и точность для элемента формата. Рассмотрим пример с шириной:

fmt.Printf("Name: %*s", "Donald")

Здесь отсутствует аргумент для ширины, который задан в форматной строке с помощью символа *.

Для исправления нужно добавить недостающий аргумент, соответствующий ширине:

fmt.Printf("Name: %*s", 10, "Donald")

Аналогичным образом анализатор предупреждает о проблемах при работе с точностью, которая задаётся с помощью комбинации символов .*.

Можно явно указать индекс аргумента, который должен подставляться в конкретный элемент формата (по аналогии с шириной и точностью). Стоит отметить, что следующий номер аргумента для подстановки вычисляется, исходя из номера предыдущего аргумента подстановки (за исключением первого аргумента). Следовательно, если явно указать, что должен подставляться аргумент n, то следом за ним будет подставлен аргумент n + 1.

Рассмотрим пример:

fmt.Printf("2: %[2]s, 1: %[1]s, 3: %s", "Donald", "James", "Michael")

В данном случае в stdout будет выведено:

2: James, 1: Donald, 3: James

Аргумент "Michael" игнорируется. Это происходит из-за того, что перед ним подставляется первый аргумент %[1]s. Таким образом, следующим аргументом для подстановки будет второй, которому соответствует James.

Для исправления явно укажем индекс аргумента, который должен соответствовать последнему элементу формата:

fmt.Printf("2: %[2]s, 1: %[1]s, 3: %[3]s",
           "Donald", "James", "Michael")

Теперь в stdout будет выведена корректная строка:

2: James, 1: Donald, 3: Michael