1 回答

TA貢獻1856條經驗 獲得超17個贊
變量和函數之間的行為似乎是一致的——兩者都允許在包級范圍內,即使未使用。
此代碼段在編譯時沒有任何問題:
package main
var v int // unused variable
func f() {} // unused function
func main() {}
現在,當涉及到局部作用域時,情況有所不同,未使用的變量會產生錯誤。函數字面量相同(Go 中不允許命名嵌套函數):
func main() {
func() {}
}
// Error: func literal evaluated but not used
最后,為什么只檢查局部范圍內未使用的變量?因為通常它是一個錯誤(例如,在 Go 中,由于意外使用了:=)。編譯器在這里救了我很多次??紤]一下:
func f() (err error) {
if somthing {
err := g() // err is unused variable! I really meant `=`.
}
return
}
對于全局(包級)范圍,未使用的變量和函數通常只會污染命名空間,例如,有人在重構后忘記刪除它們。有一些工具可以幫助檢測這些,例如:
https://github.com/opennota/check
https://github.com/alectomas/gometalinter(使用之前的包)
https://github.com/remyoudompheng/go-misc/blob/master/deadcode/deadcode.go
我還發現了Russ Cox對這個問題的評論:
我最近一直在用 gcc -Wall -Werror 編寫一些 C 代碼。當您只是嘗試測試到目前為止所擁有的內容或注釋掉可能會引起問題的調用時,它會使原型代碼變得有些難以被告知“您沒有使用該功能,去修復它”。當然,對于未使用的局部變量的警告也是如此。不同之處在于,在 Go 中,由于 :=,未使用的局部變量通常是一個錯誤,而未使用的未導出函數則很少是錯誤。
拉斯
- 1 回答
- 0 關注
- 270 瀏覽
添加回答
舉報