Golang: Пакеты
Пакеты — отличный способ организовать код в больших проектах. Мы можем создать отдельный файл, который может включать определенные вспомогательные функции или переменные из других файлов или скриптов. Существует несколько типов пакетов, таких как пакеты из стандартной библиотеки, пакеты сообщества с открытым исходным кодом и пользовательские пакеты, которые вы можете создавать самостоятельно. В этом конкретном разделе мы рассмотрим основы пакетов и изучим стандартную библиотеку в golang.
Что такое пакет?
Проще говоря, пакет — это набор сценариев go, которые могут служить определенной цели. Точно так же, как fmt
имеет несколько функций, таких как Println
, Printf
, Scan
, Scanf
и т. д.
Большинство пакетов имеют функции, которые мы можем использовать в наших собственных программах для решения простой проблемы. Мы уже создали много пакетов, но пока ни один из них не был супер полезным, мы просто использовали инструкцию package main
и нигде не использовали пакет. Каждый пакет имеет точку входа, вызываемую main
вместе с функцией входа main
, которая запускается при запуске пакета.
- package_name - script_1.go - script_2.go - sub_package_name - utility_1.go - go.mod
Выше приведена простая структура папок для пакета в golang, у нас есть сам пакет в качестве имени папки. Внутри папки пакета у нас будут сценарии или подпакеты, если таковые имеются. Также во всех папках исходного пакета есть go.mod
файл, который содержит метаинформацию о пакете и его зависимостях.
Давайте посмотрим на исходный код пакета fmt , в нем есть файл print.go , в котором есть все функции, связанные с печатью, а также отдельные файлы для разных основных функций.
Вскоре мы подробно рассмотрим пакеты из этой серии. Сейчас нас интересуют только основы пакета в golang.
Импорт пакетов
Мы уже импортировали пакет с тех пор, как написали наш hello world in go, пакет fmt
, который содержит некоторые функции для форматирования, печати, ведения журнала и различных манипуляций с вводом/выводом строк.
import "fmt"
Итак, мы использовали простой import "package"
оператор, но есть еще несколько способов импортировать пакеты, если у нас есть несколько пакетов для импорта.
import ( "fmt" "math" )
Используя ()
и указав имя пакета, мы можем импортировать сразу несколько пакетов. Также есть более трудный путь, если вы действительно любите тяжело трудиться.
import "fmt" import "math"
Обычно этого избегают, так как это выглядит слишком питоническим, мы находимся в golang.
Псевдонимы импортированных пакетов
Мы можем присвоить пакету любое имя для использования в остальной части файла сценария. Это позволяет немного улучшить семантику более длинных имен пакетов в читаемом коде.
package main import ( "fmt" r "math/rand" ) func main() { fmt.Println(r.Int()) }
$ go run import.go 3454565657742387432
Мы импортировали пакет math/rand
, здесь rand — это подпакет основного пакета math. Следовательно, мы назвали пакет rand as r
и, таким образом, мы можем использовать r для доступа ко всем функциям и другим типам из пакета.
Импорт пустого пакета
Мы даже можем импортировать пакет, но не использовать его без ошибки компиляции. Таким образом, пустой идентификатор используется в golang, чтобы игнорировать инициализированные или возвращаемые значения из любого контекста и избегать предупреждений или ошибок компиляции.
package main import ( _ "fmt" ) func main() { }
$ go run blank_import.go
Здесь мы импортировали fmt
пакет с _
пустым идентификатором, но мы его нигде не использовали, тем не менее мы не получаем никаких сообщений об ошибках, и он успешно скомпилировал код.
Стандартные пакеты библиотек
В стандартной библиотеке Golang есть большое количество пакетов, которые можно использовать для некоторых общих задач, таких как форматирование ввода/вывода, обработка файлов, веб-запросы, системные команды и т. д. Вы можете просмотреть весь список вместе с документацией на официальном сайте.
Мы можем импортировать эти пакеты стандартных библиотек, просто проанализировав их имена в строковых кавычках, как мы это сделали с fmt
as "fmt"
. Ранее мы использовали rand
пакет из пакета стандартной библиотеки math в качестве подпакета с помощью оператора "math/rand"
, если мы хотим, мы можем импортировать весь math
пакет как "math"
но это нежелательно, и мы импортируем только тот пакет, который нам действительно нужен.
Существуют и другие пакеты bufio
, которые используются для чтения и выполнения операций с текстом, os
для работы с файловыми системами и вещами на уровне операционной системы, а также другие пакеты, специфичные для случаев использования, таких как шаблоны рендеринга, время, сортировка, математические операции, кодирование. и т. д. В этой серии мы рассмотрим некоторые из них.
Установка пакетов
Теперь мы можем приступить к установке других пакетов, которых нет в стандартной библиотеке. Вы можете получить документацию вместе со всеми ссылками на конкретный пакет в официальном репозитории пакетов Golang . Мы используем команду CLI для захвата пакетов в наш файл GOPATH
. ОК, GOPATH, мы не рассмотрели это!
GOPATH
GOPATH — это путь или место на системном диске, где хранятся все пакеты и модули. Вы можете получить расположение вашей переменной окружения GOPATH по умолчанию с помощью простой команды оболочки.
$ echo $GOPATH C:\Users\acer\go
Он имеет несколько папок, а именно, bin
, pkg
и src
. Эти серверы папок имеют разное назначение, например:
bin
для хранения двоичных файлов, сгенерированныхgo install
командойpkg
для хранения предварительно скомпилированных исходных файлов и объектов для более быстрого создания исполняемых файлов и компиляции.src
для хранения всех исходных файлов пакетов и модулей.
Go Get command
Теперь давайте посмотрим, как установить пакет из сообщества go на GitHub.
go get github.com/gorilla/mux
Мы установили пакет, который является мощным HTTP-маршрутизатором и диспетчером URL-адресов, и его также можно использовать для создания веб-приложений. Он называется mux
, мы не будем использовать его сразу, просто чтобы получить представление об установке и работе с пакетами в данный момент.
После выполнения команды go get
вы должны увидеть папку, которая будет добавлена в $GOPATH\pkg\mod
as github.com\gorilla
, а внутри нее у нас должна быть папка mux с последней версией. Итак, go get
команда используется для загрузки и установки пакета вместе со всеми его зависимостями.
Настройка проекта для использования пакета
Теперь у нас есть пакет, поэтому мы можем импортировать его из любого места в нашей рабочей среде.
Создайте новую папку (любое имя)
Вы можете протестировать пакет go из изолированной среды из GOPATH, создав его с помощью команды mod.
Команда mod init
является официальным способом создания модулей в golang, и она создает своего рода среду для работы над шаблонным проектом и правильной структуризации проекта/модуля/пакета.
go mod init
Установить пакеты
Мы уже установили пакет, но это была глобальная установка в GOPATH, поэтому нам нужно установить его в этом модуле.
go get github.com/gorilla/mux
Использовать пакет
Теперь мы можем перейти к фактическому использованию пакета в нашем исходном файле go. Мы не будем делать ничего сложного, просто веб-сервер. Это слишком просто, не волнуйтесь!
package main import ( "net/http" "github.com/gorilla/mux" ) func main() { router := mux.NewRouter() router.HandleFunc("/", Server) http.ListenAndServe(":8000", router) } func Server(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("Hello Mux!")) }
Сначала мы настраиваем маршрутизатор (пара HTTP-маршрутов с некоторой логикой) из функции NewRouter, предоставляемой файлом mux
. Мы прикрепим функцию к этому вновь созданному маршрутизатору, соединив URL-адрес с функцией. Итак, говоря простым языком, когда указанный URL-адрес посещается или отправляется запрос GET (не вдавайтесь в подробности), мы хотим, чтобы вызывалась или вызывалась функция, которая что-то делает. Наконец, мы настроим веб-сервер, который прослушивает порт с созданным маршрутизатором.
Последняя часть — это функция, которую мы будем вызывать при посещении URL-адреса, т. е. у Server
функции может быть любое имя. Функция должна иметь два аргумента, поскольку она вызывается маршрутизатором, модулем записи и запросом. Модуль записи — это модуль записи ответа, т. е. для записи сообщения на сервер. Мы просто воспользуемся функцией Write, чтобы просто напечатать массив байтов.
Тип записи в частности, http.ResponseWriter
поскольку мы хотим написать простой заголовок ответа HTTP. Также запрос относится к типу http.Request , поскольку мы просто принимаем HTTP-запрос.
Таким образом, при запуске следующего скрипта мы сможем увидеть простой HTTP-ответ на локальном хосте в порту 8000
или на указанном вами порту.
go run main.go
Заключение
Итак, мы смогли немного глубже погрузиться в пакеты и модули golang. Мы рассмотрели от установки до импорта пакетов в Golang, мы также коснулись основ инициализации модуля в Golang. Надеюсь, мы смогли охватить основы, когда дело доходит до пакетов в Golang.