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\modas 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

Веб-сервер GO Gorilla MUX

Заключение

Итак, мы смогли немного глубже погрузиться в пакеты и модули golang. Мы рассмотрели от установки до импорта пакетов в Golang, мы также коснулись основ инициализации модуля в Golang. Надеюсь, мы смогли охватить основы, когда дело доходит до пакетов в Golang.