package main и func main() — исполняемая программа Go
В Go точка входа задаётся двумя ключевыми словами: package main в начале файла и func main() без параметров. Библиотечные пакеты используют своё имя (package httputil, package json) и не содержат main.
См. также: Первая программа · основы · Python — аналог.
Минимальная программа
package main
import "fmt"
func main() {
fmt.Println("Hello, Go")
}
Запуск:
go run .
# или
go build -o app . && ./app
Runtime начинает с main() в пакете main.
package main vs библиотека
package main | package mylib | |
|---|---|---|
| Назначение | Собрать исполняемый бинарник | Код для import |
func main | Обязателен (ровно один в модуле cmd) | Запрещён |
go build | .exe / бинарник | .a (архив пакета) |
// calculator/calc.go — библиотека
package calculator
func Add(a, b int) int {
return a + b
}
// cmd/demo/main.go — точка входа
package main
import (
"fmt"
"example.com/myproject/calculator"
)
func main() {
fmt.Println(calculator.Add(5, 3))
}
Импорт calculator не запускает чужой main — у библиотеки его нет. Это жёстче, чем Python: роль "скрипт / модуль" разделена именем пакета и структурой каталогов (cmd/, internal/).
Несколько файлов в main
Все файлы одного каталога с package main компилируются вместе. func main() должен быть один на исполняемый пакет.
Демо и флаги CLI часто выносят в cmd/myapp/main.go, а логику — в internal/ или корневой пакет библиотеки.
init() — загрузка пакета
Функции func init() выполняются при импорте пакета (до main в программе). Порядок — по зависимостям импортов.
package demo
import "fmt"
func init() {
fmt.Println("пакет demo инициализирован")
}
При import _ "demo" или использовании пакета init сработает, main другого пакета — нет. Side effects в init для библиотек держат минимальными.
Сравнение с Python
| Python | Go |
|---|---|
| Один файл — и модуль, и скрипт | Роли разделены: main vs library package |
if __name__ == "__main__": | package main + func main() |
| Код верхнего уровня при import | Только init() и объявления; запуск — через main |
Дальше по разделу
| Тема | Статья |
|---|---|
go mod, структура проекта | Первая программа на Go — Первая программа |
| CLI cobra | CLI на cobra и viper — CLI |
| HTTP сервер | Первая программа на Gin — Gin |