Go vet sprinf checking number of arguments


I’ve found an interesting behavior of go vet with sprintf which I would not expect (it’s inside the lint check).

For this check, I get a violation:
fmt.Sprintf("%[1]s%[2]s", "foo")

When I pass more arguments into Sprintf than expected, everything is fine from go vet perspective:

fmt.Sprintf("%[1]s", "foo", "bar")

Could you explain me why go vet is not throwing a violation in this case? I’d expect it should also cover this case as developer might forget to update the formatting string. Or, at least to have a possibility to turn this kind of check on by configuration.

Thanks for explanation.

Hi and welcome to the forum.

I’m only guessing but I think the difference is because the first code can potentially panic in production while the second don’t.
It’s more “expected parameter” vs “unused parameter”

thanks for the answer.

I probably forget to mention that when there are no numbered arguments, go vet violates properly an error:

fmt.Sprintf("%s", "foo", "bar")

Why there’s also not an error for numbered arguments?

There’s already an explanation for my question at StackOverflow, so I’m closing the topic here