0

私は最近 go をインストールし、hello world の例を試していました。

package main
import "fmt"
func main() {
    fmt.Printf("hello, world\n")
}

$ go build hello.go

サイズが 1.2Mb の hello バイナリ ファイルを返します。これは、hello world プログラムだけでは比較的大きなものです。ファイルサイズが大きい理由について何か特別な理由はありますか? 「fmt」をインポートしたためですか?

4

2 に答える 2

5

これはGo の FAQです

私の些細なプログラムがなぜこんなに大きなバイナリになるのですか?

gc ツール チェーンのリンカー (5l、6l、および 8l) は、静的リンクを行います。したがって、すべての Go バイナリには、Go ランタイムと、動的型チェック、リフレクション、さらにはパニック時のスタック トレースをサポートするために必要なランタイム型情報が含まれています。

Linux で gcc を使用して静的にコンパイルおよびリンクされた単純な C の「hello, world」プログラムは、printf の実装を含めて約 750 kB です。fmt.Printf を使用した同等の Go プログラムは約 1.2 MB ですが、より強力なランタイム サポートが含まれています。

于 2013-03-10T19:35:51.010 に答える
1

はい、パッケージ「fmt」が理由の 1 つです。また、他のパッケージもインポートします。しかし、「fmt」を使用しなくても、ランタイム全体が Go バイナリに静的にリンクされています。また、Go のランタイムは単純なものではありません。たとえば、スケジューラ/ゴルーチン対 OS スレッド マネージャー、スプリット スタック アロケーター、ガベージ コレクターとガベージ コレクターに適した C スレッド フレンドリーなメモリ アロケーター、シグナル ハンドラー、スタック トレース ジェネレーターなどがあります。 ..

于 2013-03-10T18:36:23.847 に答える