登录
首页 >  Golang >  Go问答

为什么编译器对错误的格式化程序不发出警告?

来源:stackoverflow

时间:2024-02-06 18:09:22 438浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《为什么编译器对错误的格式化程序不发出警告?》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我预计以下代码至少会在编译期间发出警告,因为格式化程序与变量的类型不一致:

package main

import "fmt"

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

变量的类型在编译时已知,并且字符串格式化程序以确定性方式进行解析 - 是否有原因导致此时没有引发错误?

我得到的是输出的代码

1 %!w(string=hello)2 hello

这似乎是某种消息,告诉 %w 对于 string 类型是错误的(但仅在运行时)


正确答案


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

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

printf 根据格式说明符进行格式化并写入标准输出。它返回写入的字节数以及遇到的任何写入错误。

使用静态分析 linter,例如 go vet

go 命令 - cmd/go - go 包

报告包中可能存在的错误

用法:

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
$

好了,本文到此结束,带大家了解了《为什么编译器对错误的格式化程序不发出警告?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>