Golang未使用インポートエラーを無効にする方法


96

デフォルトでは、Goは未使用のインポートをエラーとして扱い、インポートを削除するように強制します。この動作を変更したい、たとえば警告に変更したいという希望があるかどうか知りたい。

この問題は非常に煩わしく、Goでのコーディングを楽しむことができません。

たとえば、一部のコードをテストして、セグメント/関数を無効にしました。libの一部の関数(fmt、エラーなど)は使用されなくなりましたが、少しテストした後、関数を再度有効にする必要があります。これらのインポートを削除しない限り、プログラムはコンパイルされません。数分後、libを再インポートする必要があります。

GAEプログラムを開発するとき、私はこのプロセスを何度も繰り返していました。


1
未使用のインポートをコードに残しておくことはお勧めできませんが、一時的にコメントアウトすることができます。
elithrar 2013年

70
未使用のインポートを残しておくのは良い考えではありませんが、このようなことをするためにプログラマーの努力を不必要に無駄にするのは悪い考えです。特に、これは何かをテストするときに非常に頻繁に発生します。これらの反対票は、これらの囲碁ファンによる囲碁に対する私の態度のためのものでなければなりません。
Nick


1
未使用のインポートを削除することは良いことです。すべての警告をエラーとして処理する必要がある多くのスタイルガイドがあるため、新しい警告を追加することは一般的に悪い考えです。おそらく-devフラグは妥協の可能性があるかもしれませんが、var _ = <module>.Functionうまく機能し、それが一般的な習慣になるのを防ぐのに十分目立ちます。
deft_code 2013年

1
以下の回答で誰かが触れているように、インポートを管理するIDE(Gogland、LiteIDEなど-複数あります)を使用するかgoimports、ビルドプロセスのステップとして使用することをお勧めします。それらのいずれかがなければ、それは本当に速く古くなります。
Josef Grahn、

回答:


36

_パッケージ名の前にアンダースコア()を追加すると、未使用のインポートエラーが無視されます。

これを使用する方法の例を次に示します。

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

副作用(初期化)のみを目的としてパッケージをインポートするには、明示的なパッケージ名として空白の識別子を使用します。

詳しくはhttps://golang.org/ref/spec#Import_declarationsをご覧ください


これが正解です。GoLang仕様Docに基づいて、副作用(初期化)のためだけにパッケージをインポートするために使用することを目的としています。GoLang仕様ドキュメントはこちら:golang.org/ref/spec#Import_declarations
Will

単に素晴らしい。これは、開発者がgolangを初めて使用するときに知っておくべき10の事項のリストに含まれているはずです。ありがとうございました!
JM Janzen 2017

9
あまり役に立たない。これに関する問題は、後でインポートを再度使用する場合は削除する必要があることです_(そうしないと、パッケージに名前がないため参照できません)。あなたがそうするつもりなら、あなたは単にそれをコメント/コメント解除するのもいいかもしれません。var _ = ...トリックは、この問題はありません。
EM0

アンダースコアを"fmt"Goglandに追加"fmt"する_"fmt""fmt"、and が自動的に追加されるため、このIDEではそれが役に立たなくなります
kramer65

26

var _ = fmt.Printfトリックはここに便利です。


このソリューションが大好きです。それは望ましくないほど醜いですが、それが機能するので、本当にそれが必要な場合はそこにあります。
deft_code

3
詳細については、こちらのリンクをご覧ください。tip.golang.org/ doc / effective_go.html#blank_unused
Deepak Singh Rawat

3
現時点では役に立ちますが、この手法を使用した場合、後で戻って未使用の空白の識別子を削除しない傾向があり、長期的に使用するつもりがなかったときにインポートが残ってしまいました。goimportsのようなツールを使用すると、実際の問題が解決され、インポートが常に最小限でクリーンになります。
mdwhatcott 2015

私の意見ではまだ愚かなハックですが、おそらく最も効率的な方法です。
アンソニー

+1これはファイル内のどこでも実行できるため、これは通常ひどい考えですが、ファイルにジャンプしてimportステートメントにアクセスし、コンパイルまたはテストしようとしているときに戻る必要がないようにするのに非常に役立ちます。繰り返し具体化しているコードファイル。
mtraceur

21

私は同じ問題を抱えています。未使用のインポートと変数を許可しないように言語を実装した理由は理解できますが、個人的には、この機能を使用してコードを記述しているときに煩わしいと感じています。これを回避するために、コード内で未使用の変数とインポートを許可するオプションのフラグを許可するようにコンパイラーを変更しました。

興味がある場合は、https://github.com/dtnewman/modified_golang_compilerで確認できます

これで、go run -gcflags '-unused_pkgs' test.goなどのコマンドを使用してコードを実行できますが、これらの「未使用のインポート」エラーはスローされません。これらのフラグを省略すると、未使用のインポートを許可しないというデフォルトに戻ります。

これを行うには、いくつかの簡単な変更のみが必要でした。Go純粋主義者は、未使用の変数/インポートを許可しない正当な理由があるため、おそらくこれらの変更に満足しないでしょう。しかし、この問題によりGoでのコード作成があまり楽にならないと私は個人的に同意します。コンパイラ。


2
私は1.6リリースでも同じことを行っています。興味がある場合は、ここを確認してください。github.com / ronelliott / go / tree / release-branch.go1.6注:一部のテストは失敗します
Ron E

2
この背後にあるアイデアが大好きです。あなたがフォークしているのはまだバージョン1.2ですが、それは役に立たないようです。これは、少なくとも標準のgoコンパイラに含める必要があります。これgo run main.goにより、デフォルトではエラーが無効にgo buildなり、エラーは有効になります。この方法を使用するgo runと、開発が簡単で、本番用にビルドするときでも、コードをクリーンアップする必要があります。
kramer65 2017

17

goimportsを使用します。基本的にはのフォークでありgofmt、Brad Fitzpatrickによって作成され、go toolsパッケージに含まれています。ファイルを保存するたびにエディターを実行するようにエディターを構成できます。この問題を心配する必要はもうありません。


5

fmt開発およびテスト中にコンソールへの一般的な印刷にパッケージを使用している場合は、logパッケージでより良い解決策を見つけることができます。


5
または、println人々が常に忘れているように見える組み込み関数。
MatrixFrog 2013年

2
@MatrixFrog長期的には、これらの関数は時間の経過とともに消えてしまう可能性があるため、これらの関数に基づいて構築することはお勧めできません。ログを使用することをお勧めします。ログは標準ライブラリの一部であり、削除される可能性は低いためです。詳細については、仕様をご覧ください。
nemo 2013年

1
組み込みprintln?? これは私にとってニュースです。文書化されていませんか?どこにも見つかりません。
マット

1
@ネモ良い点。それらは、何かをすばやく1回限りで印刷する必要がある場合に最適ですが、実際にチェックインするつもりはありません。おそらく、他の場合に使用するのはよくありません。
MatrixFrog 2013年

1
@MartinTournoij-同意しません。これは、5年前にこの問題が発生したときに最終的に見つけた解決策であり、5以上の賛成投票で明らかに他の人を助けました。私はfmtロギング用のパッケージを使用する初心者でしたが、既成のロギングパッケージがあることに気づきませんでした。
OldCurmudgeon

5

一部のコードif false { ... }コメント化するために使用します。中かっこ内のコードは構文的に正しい必要がありますが、それ以外の場合は無意味なコードにすることができます。


3
その他の構文的に正しいのではなく、任意の参照変数(例えばfoo.Barは)など、存在している必要があります
ドラゴン

これは非常にクリーンでも慣用的でもありません。Goがそのように設計された理由があります
Acidic9

1
これは、Golangでスクリプトを開発したりAPIを探索したりするときに、単に物事を試すときに便利なテクニックです。トップスキップありがとうございます!
ジェイテイラー

2

多くの人々がすでに正当な正当化をもってコメントしており、私も原作者の意図を認めています。しかし、Rob Pikeは、他のいくつかの主流のプログラミング言語には欠けている、または簡単に達成できないプロセスの単純化の結果がGoであると、さまざまなフォーラムで言及しました。Goの言語セマンティクスであり、コンパイルを高速化するために、最初は非効率であるように思われる多くのものが採用されています。

簡潔にするために、未使用のインポートはGoでエラーと見なされます。プログラムを汚し、コンパイルを遅くするためです。副作用(_)にインポートを使用することは回避策ですが、特にコードベースがデバッグ/テストの目的で純粋にインポートされた副作用と一緒に副作用のある有効なインポートが混在している場合、これが混乱することがあります大きいため、後で他のエンジニアやレビュー担当者を混乱させる可能性があるため、忘れて削除しないようにしてください。以前は未使用のものをコメントアウトしていましたが、VSコードやGolandなどの人気のあるIDEはgoimports簡単に使用でき、インポートの挿入と削除がかなりうまくいきます。詳細については、リンクを参照してください、https://golang.org/doc/effective_go.html#blank_import


これをありがとう!私は明示的にコピー&ペーストあなたは副作用のために輸入の具体的な例として、あなたの応答に掲載されたURLからのコードの行をお勧めしたい: import _ "net/http/pprof"
ドラゴン

1
あなたの提案を@ドラゴンに感謝します!私は新しい貢献者なので、あなたのような人々の助けを借りて、私の投稿をすぐに良くしていきます。
sbcharr

-1

これをドキュメントの上に置き、未使用のインポートについては忘れてください。

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs

1
本当に必要な場合にコンパイラーにデッドコードを生成させるのではなく、代わりに_グローバル変数を使用します(たとえば、1行に1つのパッケージを使用するか、または以下のようにまとめて主張する場合var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs)。ただし、これは行わず、を使用してくださいgoimports
Dave C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.