Si consideri il seguente programma:
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
Se costruisco questo sulla mia macchina Linux AMD64 (Go 1.9), in questo modo:
$ go build
$ ls -la helloworld
-rwxr-xr-x 1 janf group 2029206 Sep 11 16:58 helloworld
ottengo aa binario che è di circa 2 Mb in dimensione.
La ragione di questo (che è stato spiegato in altre risposte) è che stiamo utilizzando il pacchetto "fmt" che è abbastanza grande, ma il binario non è anche stata spogliata e questo significa che la tabella dei simboli è ancora lì .Se invece il compilatore per mettere a nudo il binario, diventerà molto più piccolo:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 1323616 Sep 11 17:01 helloworld
Tuttavia, se riscriviamo il programma di utilizzare la funzione built-in di stampa, invece di fmt.Println, in questo modo:
package main
func main() {
print("Hello World!\n")
}
e quindi compilare esso:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 714176 Sep 11 17:06 helloworld
si finisce con un binario ancora più piccolo. Questo è il minimo che possiamo ottenere senza ricorrere a trucchi come UPX-packing, quindi il sovraccarico di Go-runtime è di circa 700 Kb.
Enorme? Immagino che tu non faccia molto Java allora! –
Beh, im da sfondo C/C++! –
Ho appena provato questo mondo ciao-scala nativo: http://www.scala-native.org/en/latest/user/sbt.html#minimal-sbt-project Ci è voluto un po 'di tempo per compilare, scaricare un sacco di roba, e il binario è 3.9MB. – bli