Урок 7 из 8 · 20 мин · обновлено

Пакеты, модули и стандартная библиотека

Как устроен проект на Go: пакеты, экспорт через заглавную букву, модуль и файл go.mod, команды go run, go build и go fmt, а также что умеет стандартная библиотека.

Пакеты

Программа на Go состоит из пакетов. Пакет — это папка с файлами .go, в начале которых стоит одна и та же строка package имя. Вы уже пользовались чужими пакетами: fmt, strconv, errors. Несколько пакетов подключают одним блоком:

Go
import (
	"fmt"
	"strconv"
	"strings"
)

Вызывая функцию из пакета, пишут его имя и точку: strings.ToUpper("чай").

Что видно снаружи. В Go нет слов public и private. Всё решает первая буква имени:

  • ToUpper, Println, Shout — с заглавной буквы, их можно вызывать из других пакетов;
  • helper, total — со строчной, они видны только внутри своего пакета.

Это правило касается функций, типов, полей структур и констант. Помните поля Title и Price в прошлом уроке? Их писали с заглавной, чтобы с ними могли работать и другие пакеты.

Модуль и go.mod

Весь проект — это модуль. Его создают одной командой в пустой папке:

Терминал
go mod init hello

Появится файл go.mod:

Текст
module hello

go 1.27.2

В нём имя модуля и версия Go. Когда проект начнёт пользоваться сторонними пакетами, их список тоже окажется здесь.

Свой пакет — это просто папка внутри модуля. Например, textutil/textutil.go:

Go
package textutil

import "strings"

// Shout делает текст громким: заглавные буквы и восклицательный знак.
func Shout(s string) string {
	return strings.ToUpper(s) + "!"
}

В main.go его подключают по пути «имя модуля / папка»:

Go
package main

import (
	"fmt"

	"hello/textutil"
)

func main() {
	fmt.Println(textutil.Shout("скидки"))
}
Результат
СКИДКИ!

Если вызвать из main функцию со строчной буквы, например textutil.helper(), компилятор ответит undefined: textutil.helper: для других пакетов её просто нет.

Сторонние пакеты подключают командой go get с адресом репозитория, например go get github.com/jackc/pgx/v5 — драйвер для базы PostgreSQL. Go скачает пакет и запишет его в go.mod.

Главные команды

Терминал
go run .
go build
go fmt ./...
go vet ./...
  • go run . — собрать и сразу запустить программу из текущей папки;
  • go build — собрать исполняемый файл. Его запускают без Go и отправляют на сервер;
  • go fmt ./... — привести код всех пакетов к единому стилю. В командах на Go не спорят о расстановке скобок: стиль один на всех;
  • go vet ./... — найти подозрительные места, которые компилятор пропускает. Например, неверный заполнитель в Printf.

Запись ./... означает «текущая папка и все вложенные».

Стандартная библиотека

Go поставляется с большой стандартной библиотекой. Многое, для чего в других языках ставят сторонние пакеты, здесь есть сразу:

Go
fmt.Println(strings.Contains("Москва", "сква"))
fmt.Println(strings.Split("чай,кофе,сок", ","))
fmt.Println(strconv.Itoa(2026) + " год")
fmt.Println(90 * time.Minute)
Результат
true
[чай кофе сок]
2026 год
1h30m0s
  • strings — поиск, замена, разбиение строк;
  • strconv — числа в строки и обратно;
  • time — даты, длительности, паузы;
  • os — файлы и параметры запуска;
  • net/http — веб-сервер и запросы к другим сервисам;
  • encoding/json — данные в формате JSON, на котором общаются почти все API.

Вот целый веб-сервер на одной стандартной библиотеке:

Go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Привет от сервера на Go!")
	})
	http.ListenAndServe(":8080", nil)
}

Запустите его через go run . и откройте в браузере localhost:8080 — увидите приветствие. Именно с таких программ начинается бэкенд на Go.

Попробуйте сами. Создайте модуль hello и в нём пакет textutil с функцией Shout из урока. Добавьте в пакет вторую функцию Whisper, которая переводит текст в строчные буквы и добавляет многоточие. Подсказка: strings.ToLower. Вызовите обе функции из main.

Решение

Файл textutil/textutil.go:

Go
package textutil

import "strings"

func Shout(s string) string {
	return strings.ToUpper(s) + "!"
}

func Whisper(s string) string {
	return strings.ToLower(s) + "..."
}

Файл main.go:

Go
package main

import (
	"fmt"

	"hello/textutil"
)

func main() {
	fmt.Println(textutil.Shout("скидки"))
	fmt.Println(textutil.Whisper("ТИШЕ"))
}
Результат
СКИДКИ!
тише...

Обе функции начинаются с заглавной буквы, поэтому видны из main. Запускать нужно из папки модуля командой go run .: точка означает «пакет из текущей папки».

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. В пакете textutil есть функции Shout и helper. Какую из них можно вызвать из пакета main?

  2. Что делает команда go mod init hello?

  3. Чем go build отличается от go run?

  4. Нужно сделать простой веб-сервер. Что для этого понадобится в Go?