調用 fmt.Printf 等字符串格式化函數似乎是 Go 編譯器的弱點。我最終遇到了很多錯誤(重構后使用了錯誤的格式化程序,忘記包含所有參數),這些錯誤只會在運行時顯示出來。因此,每次寫其中一個時,我最終都不得不瞇著眼睛。我今天做了一些研究并發現go tool vet,它似乎適用于 fmt.Printf,但它不會捕獲 errors.Errorf 中的錯誤(見下文)。import "github.com/pkg/errors"func ReturnError(s string, i int) error { // Swap %d and %s, and forget to include the second argument return errors.Errorf("invalid arguments %d and %s", s)}是否有類似的東西go tool vet可以捕獲 errors.Errorf() 中的字符串格式錯誤?另外,根據我自己的理解,為什么這是一個如此困難的問題?對于 Go 編譯器來說,捕捉字符串格式化類型錯誤似乎并不比任何其他類型的錯誤更難。
1 回答

米琪卡哇伊
TA貢獻1998條經驗 獲得超6個贊
您可以知道go vet
要檢查哪些功能(比較godoc.org/cmd/vet):
$ cat x.go
package main
import "github.com/pkg/errors"
func ReturnError(s string, i int) error {
// Swap %d and %s, and forget to include the second argument
return errors.Errorf("invalid arguments %d and %s", s)
}
$ go vet x.go
$ go vet -printfuncs Errorf x.go
# command-line-arguments
./x.go:7: Errorf format %d has arg s of wrong type string
由于多種原因,要更好地做到這一點并不簡單:
格式字符串是運行時值:您可能會調用
fmt.Sprintf(prefix + "%s", ...)
. 所以不可能在編譯時捕獲所有無效的格式字符串。格式字符串沒有特殊類型。因此,編譯器無法通過查看函數定義輕松確定某個函數(
errors.Errorf
在本例中)期望其參數的行為與fmt.Printf
函數定義相同。
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消