亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查 errors.Errorf() 中的類型錯誤?

如何檢查 errors.Errorf() 中的類型錯誤?

Go
暮色呼如 2023-03-21 16:51:50
調用 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函數定義相同。


查看完整回答
反對 回復 2023-03-21
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號