Considérez le programme suivant:
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
Si je construis ceci sur ma machine Linux AMD64 (Go 1.9), comme ceci:
$ go build
$ ls -la helloworld
-rwxr-xr-x 1 janf group 2029206 Sep 11 16:58 helloworld
J'obtiens un binaire d'environ 2 Mo de taille.
La raison à cela (qui a été expliquée dans d'autres réponses) est que nous utilisons le package "fmt" qui est assez volumineux, mais le binaire n'a pas non plus été supprimé et cela signifie que la table des symboles est toujours là. Si nous demandons au compilateur de supprimer le binaire, il deviendra beaucoup plus petit:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 1323616 Sep 11 17:01 helloworld
Cependant, si nous réécrivons le programme pour utiliser la fonction intégrée print, au lieu de fmt.Println, comme ceci:
package main
func main() {
print("Hello World!\n")
}
Et puis compilez-le:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 714176 Sep 11 17:06 helloworld
Nous nous retrouvons avec un binaire encore plus petit. C'est aussi petit que nous pouvons l'obtenir sans recourir à des astuces comme UPX-packing, donc la surcharge du Go-runtime est d'environ 700 Ko.