Перейти к основному содержимому

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 mainpackage 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

PythonGo
Один файл — и модуль, и скриптРоли разделены: main vs library package
if __name__ == "__main__":package main + func main()
Код верхнего уровня при importТолько init() и объявления; запуск — через main

Дальше по разделу

ТемаСтатья
go mod, структура проектаПервая программа на Go — Первая программа
CLI cobraCLI на cobra и viper — CLI
HTTP серверПервая программа на Gin — Gin