Урок 7 из 8 · 20 мин · обновлено
Пакеты, модули и стандартная библиотека
Как устроен проект на Go: пакеты, экспорт через заглавную букву, модуль и файл go.mod, команды go run, go build и go fmt, а также что умеет стандартная библиотека.
Пакеты
Программа на Go состоит из пакетов. Пакет — это папка с файлами .go, в начале которых стоит одна и та же строка package имя. Вы уже пользовались чужими пакетами: fmt, strconv, errors. Несколько пакетов подключают одним блоком:
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:
package textutil
import "strings"
// Shout делает текст громким: заглавные буквы и восклицательный знак.
func Shout(s string) string {
return strings.ToUpper(s) + "!"
}
В main.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 поставляется с большой стандартной библиотекой. Многое, для чего в других языках ставят сторонние пакеты, здесь есть сразу:
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.
Вот целый веб-сервер на одной стандартной библиотеке:
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:
package textutil
import "strings"
func Shout(s string) string {
return strings.ToUpper(s) + "!"
}
func Whisper(s string) string {
return strings.ToLower(s) + "..."
}
Файл main.go:
package main
import (
"fmt"
"hello/textutil"
)
func main() {
fmt.Println(textutil.Shout("скидки"))
fmt.Println(textutil.Whisper("ТИШЕ"))
}
СКИДКИ!
тише...
Обе функции начинаются с заглавной буквы, поэтому видны из main. Запускать нужно из папки модуля командой go run .: точка означает «пакет из текущей папки».
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
В пакете textutil есть функции Shout и helper. Какую из них можно вызвать из пакета main?
В Go нет слов public и private: всё решает первая буква имени. С заглавной — экспортируется, со строчной — видна только внутри своего пакета.
-
Что делает команда go mod init hello?
go mod init создаёт модуль: файл go.mod с именем проекта и версией Go. С него начинается любой проект.
-
Чем go build отличается от go run?
go run удобен при разработке. go build создаёт готовую программу — её и отправляют на сервер.
-
Нужно сделать простой веб-сервер. Что для этого понадобится в Go?
Стандартная библиотека Go умеет работать с сетью и HTTP. Сторонние пакеты добавляют удобства, но для старта они не нужны.