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

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

為什么我們可以有未使用的函數但我們不能有未使用的變量?

為什么我們可以有未使用的函數但我們不能有未使用的變量?

Go
一只甜甜圈 2021-11-22 17:00:51
未使用的變量會阻止編譯(這是一件好事)但編譯器并不真正關心未使用的函數,有解釋嗎?
查看完整描述

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 中,由于 :=,未使用的局部變量通常是一個錯誤,而未使用的未導出函數則很少是錯誤。


拉斯


查看完整回答
反對 回復 2021-11-22
  • 1 回答
  • 0 關注
  • 270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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