この質問への回答
Goのリンカーは、プログラムのエントリポイント(main.mainおよびすべてのパッケージのinit関数)から始まる依存関係グラフを構築する到達可能性分析アルゴリズムを通じてデッドコード排除を実行します。呼び出しグラフをトラバースし、静的に参照されるすべての関数とグローバル変数をマークし、その後、最終的なバイナリを書き込む前に未マークのシンボルを破棄します。このプロセスは保守的であり、関数のアドレスが取得されてインターフェースに保存された場合、reflect.Value.Callに渡されるか、アセンブリコードまたは**//go:linknameディレクティブを介して参照される場合、リンカーはそれを保持しなければならないため、ランタイムで関数が呼び出されないことを証明できません。さらに、CGOでエクスポートされた関数や、リフレクションベースのデコードに登録されたメソッド(json.Unmarshalをinterface{}**に入れ、それを具体的な型に動的にディスパッチするなど)は、通常到達不可能なコードパスの保持を強いることがあります。この最適化はデフォルトで有効であり、パッケージ間で機能し、アプリケーションの到達可能なコードからの参照が存在しない場合、サードパーティの依存関係内の未使用コードが排除されます。