2015-11-17 59 views
0

未使用的變量將阻止編譯(這是一件好事),但編譯器並不真正關心未使用的函數,是否有解釋?爲什麼我們可能有未使用的函數,但我們不能有未使用的變量?

+0

你不使用它們並不意味着你的另一個類的消費者不會。未使用的變量不會默認阻止編譯。據我所知,這是一個警告。 –

+0

@OguzOzgul你是對的,但是,在一個主要的包? – Mistermatt

+0

此問題不是最初標記的問題的重複([this](http://stackoverflow.com/questions/22549228/why-does-golang-allow-compilation-of-unused-function-parameters),因爲它是關於未使用的函數_parameters_而不是_functions_本身),但這是[爲什麼Golang允許編譯未使用函數?]的可能重複(http://stackoverflow.com/questions/32564935/why-does-golang-allow-編譯-的未使用的函數)。 – icza

回答

2

變量和函數之間的行爲似乎一致 - 即使未使用,它們都可以在包級別作用域中使用。

這段代碼在編譯沒有任何問題:

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 
} 

對於全局(數據包級)作用域未使用的變量和函數通常只是污染命名空間,例如,有人忘了重構之後將其刪除。還有就是一些工具這有助於檢測這些,例如:

  1. ​​
  2. https://github.com/alecthomas/gometalinter(使用以前的包)
  3. https://github.com/remyoudompheng/go-misc/blob/master/deadcode/deadcode.go

我還發現了一個post by Russ Cox評論的問題:

我一直在用C編寫一些C代碼 - 最近 - 錯誤。它 使原型代碼有點難以告訴「你沒有使用 該功能,去修復它」,當你只是試圖測試你到目前爲止,或者註釋掉可能導致麻煩的呼叫。 當然,對於未使用的局部變量 也是如此。區別在於,在Go中,由於:=,一個未使用的本地變量 通常是一個bug,而未使用的未導出函數是 ,這通常是一個bug。

拉斯

相關問題