вывод %!(EXTRA int=1)

наткнулся на старнную запись в логе

2024/04/13 14:58:58 article.NumOfRequests = %!(EXTRA int=1)

выводится при исполнении кода:

article, err := articlefinder.FindBySeoId(seoId, service.Repos.GetArticles())
    article.NumOfRequests += 1
    log.Printf("article.NumOfRequests = ", article.NumOfRequests)
    return *article, err

что значит такой странный формат вывода?


Ответы (1 шт):

Автор решения: Pak Uula

У вас в Printf аргументов больше, чем директив форматирования. Все "лишние" аргументы печатаются как %!(EXTRA type=value):

fmt.Printf("Hello, %s", "world", 123, 456.789, true)
Hello, world%!(EXTRA int=123, float64=456.789, bool=true)

Такой вызов не нарушает правила языка, поэтому компилятор не ругается. Если вы хотите отлавливать такие ошибки на этапе сборки, добавте в makefile вызов go vet. Эта команда выдаст ошибку

./prog.go:8:2: fmt.Printf call needs 1 arg but has 4 args

Попробуйте заодно подставить значение не того типа, какое ожидает спецификатор. Например, в качестве аргумента для %s подставьте число:

fmt.Printf("Hello, %s", 123)

Будет напечатано Hello, %!s(int=123), формат вывода %!<spec>(type=value).

Такие ошибки go vet тоже находит: fmt.Printf format %s has arg 123 of wrong type int

→ Ссылка