為什麼編譯器不警告錯誤的格式化程式? 在程式設計中,格式化程式是一種用於美化程式碼的工具。它可以自動調整程式碼的縮排、空格、換行等,讓程式碼更易讀。然而,有時候我們可能會犯一些格式化程式的錯誤,例如缺少括號、多餘的分號等。儘管這些錯誤可能會導致程式碼邏輯上的錯誤,但編譯器往往不會對這些錯誤進行警告。那麼,為什麼編譯器不會警告這些錯誤的格式化程式呢? 首先,編譯器的主要任務是將原始程式碼轉換為可執行的機器碼,它會對語法錯誤進行檢查,以確保程式碼的正確性。然而,格式化程式的錯誤往往是一種語義上的錯誤,而不是語法上的錯誤。換句話說,這些錯誤並不影響程式碼的可執行性,只是讓程式碼的可讀性變差。因此,編譯器沒有義務去警告這些錯誤。 其次,格式化程式的錯誤通常是主觀的,不同的開發人員有不同的編碼風格和偏好。例如,有些人喜歡在程式碼中使用大括號,而有些人則不喜歡使用大括號。編譯器無法確定哪種風格是正確的,因此也無法對格式化程式的錯誤進行警告。 最後,警告格式化程式的錯誤可能會產生大量的誤報。在大型專案中,程式碼的規模往往非常龐大,一個小小的格式化程式錯誤可能會導致成千上萬的警告。這不僅會對開發人員造成困擾,也會增加程式碼維護的難度。為了避免這
我預計以下程式碼至少會在編譯期間發出警告,因為格式化程式與變數的類型不一致:
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 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 $
以上是為什麼編譯器不警告錯誤的格式化程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!