Considera il seguente programma:
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
Se lo costruisco 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 un file binario di circa 2 Mb.
La ragione di questo (che è stata spiegata in altre risposte) è che stiamo usando il pacchetto "fmt" che è abbastanza grande, ma anche il binario non è stato rimosso e questo significa che la tabella dei simboli è ancora lì. Se invece ordiniamo al compilatore di rimuovere 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 per utilizzare la funzione incorporata print, invece di fmt.Println, in questo modo:
package main
func main() {
print("Hello World!\n")
}
E poi compilarlo:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 714176 Sep 11 17:06 helloworld
Finiamo con un binario ancora più piccolo. Questo è il minimo che possiamo ottenere senza ricorrere a trucchi come l'UPX-packing, quindi il sovraccarico del Go-runtime è di circa 700 Kb.