Menu

Hello World на Go: первая программа на Golang с разбором

Программа hello world на Go построчно: package main, блок import, func main и fmt.Println, а также как её запустить и какие ошибки компиляции новички встречают первыми.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Вот программа целиком. Нажмите Run.

Ни одна из этих строк не является необязательной. Ниже разобрано, что делает каждая.

Построчный разбор

package main

Каждый файл Go начинается с объявления package, где указан пакет, к которому файл относится. Имя main особое: оно помечает пакет как исполняемую программу. Любое другое имя (package utils, package hello) создаёт библиотеку, которую импортирует другой код, но которую нельзя запустить саму по себе.

import "fmt"

import подключает другой пакет, чтобы вы могли им пользоваться. fmt это пакет стандартной библиотеки для форматирования и печати. После импорта его экспортированные имена доступны через имя пакета: fmt.Println, fmt.Printf, fmt.Sprintf.

Чтобы импортировать несколько пакетов, используйте блок в скобках, по одному пути на строку:

import (
	"fmt"
	"strings"
)

Go не компилирует файл, который импортирует неиспользуемый пакет. Так списки зависимостей остаются честными, и это первая ошибка, на которую натыкается большинство.

func main()

func объявляет функцию. main в пакете main это точка входа: программа начинается, когда стартует main, и заканчивается, когда main возвращает управление. Функция не принимает аргументов и ничего не возвращает. Аргументы командной строки берутся из os.Args, а код выхода задаётся через os.Exit.

fmt.Println("Hello, World!")

Println печатает аргументы, ставит между ними пробел и добавляет перевод строки. Имя начинается с заглавной буквы, потому что из пакета экспортируются только имена с заглавной буквы. fmt.println со строчной p это ошибка компиляции.

Печать не только строк

Println принимает любое число значений любого типа. Printf даёт контроль над форматом:

%s заменяется строкой, а %d целым числом. Printf и Print не добавляют перевод строки, поэтому \n вы пишете сами. Полная таблица глаголов есть на странице fmt.Printf.

Запуск на своём компьютере

Установив Go, сохраните программу как main.go в пустой папке и запустите:

go run main.go
Hello, World!

go run компилирует файл во временный бинарник и запускает его. Чтобы получить бинарник, который можно сохранить и скопировать куда-то ещё, используйте go build:

go mod init example.com/hello
go build
./hello
Hello, World!

go build нужен модуль (файл go.mod), который создаёт go mod init. Бинарник называется по последней части пути модуля, здесь hello (hello.exe на Windows). Разница между run, build и install разобрана на странице go run и go build.

Куда делись точки с запятой

Грамматика Go использует точки с запятой, но печатать их почти никогда не нужно. Компилятор вставляет её в конце любой строки, последний токен которой может завершать инструкцию: идентификатор, литерал, ), } и несколько ключевых слов вроде return. Из-за этого правила привычный по другим языкам стиль не работает:

func main()
{
	fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {

После func main() вставилась точка с запятой, поэтому { на следующей строке даёт ошибку. Открывающая скобка всегда ставится на той же строке. То же правило действует для if, for, switch и любого другого блока.

Первые ошибки с объяснениями

Это сообщения, которые новички видят в первый же час, ровно в том виде, в каком их печатает Go 1.24.

Неиспользуемый импорт или переменная.

package main

import (
	"fmt"
	"os"
)

func main() {
	x := 5
	fmt.Println("hi")
}
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x

Оба случая это ошибки компиляции, а не предупреждения. Удалите импорт или переменную. Если переменная нужна на время отладки, присвойте её пустому идентификатору: _ = x.

Имя функции со строчной буквы.

./main.go:6:6: undefined: fmt.println

Неэкспортированные имена не видны за пределами своего пакета. Используйте fmt.Println.

Неправильное имя пакета.

package example.com/hello is not a main package

В файле написано package hello (или что угодно, кроме main), а вы попытались его запустить. Замените на package main.

Нет модуля.

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

go build и go run . работают с модулями. Один раз выполните go mod init example.com/hello в папке. go run main.go, где указан конкретный файл, работает и без модуля.

Форматирование

У Go один официальный стиль кода, и его применяет gofmt. Запускайте его для каждого файла, который пишете:

go fmt ./...

Он использует табы для отступов, выравнивает комментарии и поля структур и нормализует пробелы. Редакторы с поддержкой Go запускают его при сохранении. Код на Go везде выглядит одинаково, поэтому настраивать нечего и спорить на код-ревью не о чем.

Часто задаваемые вопросы

Как написать hello world на Go?

Сохраните это как main.go:

package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}

Затем выполните go run main.go. Программа выведет Hello, World!.

Зачем программе на Go нужен package main?

package main сообщает компилятору, что этот пакет является исполняемой программой, а не библиотекой. Программа начинается с функции main пакета main. Любое другое имя пакета даёт библиотеку, и go run откажется её запускать с сообщением «is not a main package».

Почему в Go открывающая скобка стоит на той же строке?

Go автоматически вставляет точку с запятой в конце строк, которые могут завершать инструкцию, в том числе после func main(). Тогда { на следующей строке начала бы отдельный блок, и компилятор сообщает syntax error: unexpected semicolon or newline before {. Скобка должна стоять на той же строке.

Что означает fmt в Go?

fmt это пакет стандартной библиотеки для форматированного ввода и вывода (название сокращено от «format»). fmt.Println печатает аргументы через пробел и добавляет перевод строки в конце; fmt.Printf печатает по строке формата.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ