2015-09-14 7 views
6

使用されていない非公開/非公開の機能が検出されました。未使用の変数のようにコンパイラが不平を言うのはなぜですか?なぜGolangは未使用機能のコンパイルを許可していますか?

編集:この質問は、未使用のプライベートタイプ/インターフェイスにも適用されます。

+5

これらは副作用なしで削除できます(常に実行される 'init'を除く)。変数のインスタンス化に副作用が生じる可能性があるためまた、パッケージレベルで未使用の変数も使用できます。 – thwd

+0

私は、副作用(つまり割り当て)を避けるだけでなく、コードをきれいに保つためにそれを行うと考えました –

+2

未使用の型(インタフェース、構造体)もエラーではありません。プログラマーが未使用のローカル変数やインポートを合理的に避けることができる一方で、未使用のヘルパー関数やタイプをコンパイルできない場合は、何かを構築するのは難しいでしょう。 – LinearZoetrope

答えて

2

これは、これがスコープとデフォルトインターフェイス{}の組み合わせだと思います。

これは、未使用のパッケージレベルで変数を宣言でき、コードがうまく構築される同じ理由です。変数testVarが使用されることはありませんにもかかわらず

package main 
import (
    "fmt" 
    "time" 
) 

var (
    testVar = "sup" 
) 

func main() { 
    start := time.Now() 

    fmt.Println("This sure was a test") 

    //Mon Jan 2 15:04:05 -0700 MST 2006 
    fmt.Println("Finished!\nTimeElapsed:", time.Since(start)) 
} 

このコードは完全に有効な、外出先コードです。

ここにはいくつかの関連する質問があり、それらはすべて同じ一般的な答えを持っていると思います。

  • なぜ未使用の変数は使用できないのですか?
  • 未使用の変数が使用されていない場合、未使用の関数パラメータはなぜ許可されますか?
  • 未使用の関数/構造体はなぜ使用できますか?

...

一般的な答えは、関数のスコープ内の未使用の変数は、常にコンパイラ時間の無駄、あるいは正当なエラーのいずれかであるということです - ので、彼らは厳密に許可されていません。

ただし、未使用の関数パラメータ、およびプライベートな構造体および関数は、インタフェースを満たすことができます。最低でも、すべてデフォルトインターフェイス{}を満たしています。そして、そのようなものでも、エラーであることはまったく保証されていません。the answer to a similar questionに指摘されているように、これらのエラーは完全にはエラーではありません。

ゴラン哲学のこの特定のコーナーの背後にある推論を概説する公式な文書はありません幸運を祈る回答を見つけ、golang-nuts forumで質問してください。

希望すると便利です。

関連する問題