Go语言 为什么编译器不警告不正确的格式化程序?

jjjwad0x  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(135)

我希望following code在编译过程中至少会发出一个警告,因为格式化程序与变量类型不一致:

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Printf("1 %w", s)
    fmt.Printf("2 %s", s)
}

变量的类型在编译时是已知的,并且字符串格式化程序是以确定性的方式解析的--是否有什么原因导致错误没有在此时出现?
我得到的是一个输出
这似乎是某种消息,告诉%w对于类型string是错误的(但仅在运行时)

smdncfj3

smdncfj31#

fmt.Printf字符串参数在运行时解释,而不是在编译时解释。

func Printf(format string, a ...any) (n int, err error)

printf根据格式说明符格式化并写入标准输出。它返回写入的字节数和遇到的任何写入错误。
使用静态分析筛选器,例如go vet
go command - cmd/go - Go Packages
报告包中可能的错误
用法:

go vet [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages]

Vet对导入路径命名的包运行Go vet命令。
有关vet及其标志的更多信息,请参见"go doc cmd/vet"。
so.go:

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Printf("1 %w\n", s)
    fmt.Printf("2 %s\n", s)
}

棉绒:

$ go vet so.go
./so.go:7:2: fmt.Printf format %w has arg s of wrong type string, 
             see also https://pkg.go.dev/fmt#hdr-Printing
$

运行时间:

$ go run so.go
1 %!w(string=hello)
2 hello
$

相关问题