Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call has possible formatting directive

Tags:

go

When I run this code

package main
import ("fmt")
func main() {
    i := 5
    fmt.Println("Hello, playground %d",i)
}

(playground link)

I get the following warning:

prog.go:5: Println call has possible formatting directive %d
Go vet exited.

What is a proper way to do this?

like image 505
Yevgeniy Gendelman Avatar asked Dec 28 '18 16:12

Yevgeniy Gendelman


2 Answers

fmt.Println doesn't do formatting things like %d. Instead, it uses the default format of its arguments, and adds spaces between them.

fmt.Println("Hello, playground",i)  // Hello, playground 5

If you want printf style formatting, use fmt.Printf.

fmt.Printf("Hello, playground %d\n",i)

And you don't need to be particular about the type. %v will generally figure it out.

fmt.Printf("Hello, playground %v\n",i)
like image 155
Schwern Avatar answered Oct 16 '22 17:10

Schwern


The warning is telling you you have a formatting directive (%d in this case) in a call to Println. This is a warning because Println does not support formatting directives. These directives are supported by the formatted functions Printf and Sprintf. This is explained thoroughly in the fmt package documentation.

As you can plainly see when you run your code, the output is

Hello, playground %d 5

Because Println does what its docs say - it prints its arguments followed by a line break. Change that to Printf, which is likely what you intended, and you get this instead:

Hello, playground 5

Which is presumably what you intended.

like image 16
Adrian Avatar answered Oct 16 '22 18:10

Adrian