Рассмотрим следующую программу:
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
Если я построю это на своей машине Linux AMD64 (Go 1.9), например:
$ go build
$ ls -la helloworld
-rwxr-xr-x 1 janf group 2029206 Sep 11 16:58 helloworld
Я получаю двоичный файл размером около 2 МБ.
Причина этого (которая была объяснена в других ответах) заключается в том, что мы используем довольно большой пакет «fmt», но двоичный файл также не был удален, и это означает, что таблица символов все еще существует. Если вместо этого мы укажем компилятору удалить двоичный файл, он станет намного меньше:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 1323616 Sep 11 17:01 helloworld
Однако, если мы перепишем программу, чтобы использовать встроенную функцию print вместо fmt.Println, например:
package main
func main() {
print("Hello World!\n")
}
А затем скомпилируйте его:
$ go build -ldflags "-s -w"
$ ls -la helloworld
-rwxr-xr-x 1 janf group 714176 Sep 11 17:06 helloworld
Мы получаем еще меньший двоичный файл. Это настолько мало, насколько мы можем получить, не прибегая к уловкам вроде UPX-упаковки, поэтому накладные расходы Go-runtime составляют примерно 700 Кбайт.