首頁 >後端開發 >Golang >為什麼編譯器不警告錯誤的格式化程式?

為什麼編譯器不警告錯誤的格式化程式?

王林
王林轉載
2024-02-09 09:48:33616瀏覽

為什麼編譯器不警告錯誤的格式化程式?

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

問題內容

我預計以下程式碼至少會在編譯期間發出警告,因為格式化程式與變數的類型不一致:

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
$

以上是為什麼編譯器不警告錯誤的格式化程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除