Розглянемо таку програму:
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 Кб.