调用具有可能的格式指令

当我运行这个代码时

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

(游乐场连接路)

我收到以下警告:

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

什么是正确的做法?

67766 次浏览

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.

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)

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