Пакеты
Пакет Go состоит из Go-файлов, расположенных в одной и той же директории, в начале которых имеется одинаковое выражение package
. Пакеты, подключаемые к программам, позволяют расширять их возможности. Некоторые пакеты входят в состав стандартной библиотеки Go. А это значит, что они, если вы пользуетесь Go, уже у вас установлены.
Код пакета располагается в одном или нескольких файлах с расширением go. Для определения пакета применяется ключевое слово package. Например:
package main
import "fmt"
func main() {
fmt.Println("Hello there")
}
В данном примере пакет называется main. Определение пакета должно идти в начале файла.
Существеют два типа пакетов: исполняемые - executable и библиотеки reusable. Для создания исполняемых файлов пакет должен иметь имя main. Все остальные пакеты не являются исполняемыми. При этом пакет main должен содержать функцию main, которая является входной точкой в приложение.
Импорт пакетов
Для использования уже готовых пакетов мы используем оператор import. Например, в примере мы подключили пакет "fmt"
, в котором есть функции Print(), Printf(), Println(), Scan() и т.д. Соответственно чтобы использовать эти функции, необходимо импортировать пакет fmt
:
import "fmt"
Нередко программы подключают (а в основном так и делают) сразу несколько пакетов. В этом случае можно импортировать каждый пакет:
import "fmt"
import "bufio"
import "math"
Однако запись в таком виде очень громоздка, поэтому существет возможность сокращенного импорта пактов:
import (
"fmt"
"bufio"
"math"
)
Подключение пакетов значительно расширяет функциональность и возможность кода в Go. Так, например, пакет "math"
предоставляет большую возможность в написании (интерпретировании) математических формул. Например, следующая мат. формула:
Будет выглядеть следующим образом:
func f(n float64) float64 {
formulaP1 := math.Sqrt(math.Pow(n, 5) + 4*math.Pow(n, 2) + 2)
formulaP2 := math.Pow(math.Pi, 2)/2 * math.Pow(math.Log2(n), 2)
return formulaP1 + formulaP2
}
Первая часть (formulaP1
) —
Вторая часть (formulaP2
) —
Полный список встроенных пакетов в Go можно найти по тут.
Пакет из нескольких файлов.
Как уже писалось ранее, один пакет может состоять из нескольких фалов. Давайте протестируем пример выше, но функцию, которую мы написали (f(n)
) будет в другом файле:
Т.е. в файле f(n).go будет этот фрагмент кода (функция):
package main
import "math"
func f(n float64) float64 {
formulaP1 := math.Sqrt(math.Pow(n, 5) + 4*math.Pow(n, 2) + 2)
formulaP2 := math.Pow(math.Pi, 2)/2 * math.Pow(math.Log2(n), 2)
return formulaP1 + formulaP2
}
А файл main.go будет исполняемым, в которой мы будем вызывать функцию f(n) из файла f(n).go:
package main
import "fmt"
func main() {
result := f(2) // 2 - входной параметр для нашей функции
fmt.Printf("%.4f", result)
}
Примечание: "%.4f"
означает количество выводимых чисел после запятой для типов float32
и float64
. Данная надпись используется только в функции вида Printf()
.
Таким образом, оба файла принадлежать пакету main (файлов, конечно, может быть больше).
Далее необходимо скомпилировать из этих двух файлов программу. Для этого прейдетм к консоле к папке наших файлов и выполним следующую команду:
go build -o main.exe f(n).go main.go
Флаг -o указывает, как будет называться выходной файл - в данном случае это main.exe. Затем идут все компилируемые файлы (f(n).go, main.go). После выполнения этой команды будет создан файл main.exe, который мы сможем запустить в консоли:
И посе запуска main.exe мы получим результат выполненной программы.
Файлы из разных пакетов
Теперь рассмотрим такую ситуацию, где файлы нашей программы разделены по разным пакетам (т.е. находятся в разных папках/директориях). Например определим в папке нашего проекта каталог (папку) mathFormules. Т.е. наша рабочая область в среде разраюотки будет выглядеть следующим образом:
Код файла f(n).go принадлежит пакету mathFormules. Код программы будет выглядеть следующим образом:
package mathFormules
import "math"
func F(n float64) float64 {
formulaP1 := math.Sqrt(math.Pow(n, 5) + 4*math.Pow(n, 2) + 2)
formulaP2 := math.Pow(math.Pi, 2)/2 * math.Pow(math.Log2(n), 2)
return formulaP1 + formulaP2
}
Важно отметить, что название функции из другого пакета должа начинаться с заглавной букы (F(n float64)
), т.к. благодаря этому эта функция будет видна в других пакетах.
Ну и тобы использовать функцию f(), надо импортировать этот пакет в файле main.go:
package main
import (
"fmt"
"./mathFormules"
)
func main() {
fmt.Printf("%.4f", mathFormules.F(2))
}
Путь "./mathFormules" указывает на то, что пакет находится в папке mathFormules.
Компиляция и выполнение программы осуществляется также как и ранее без необходимости указания всех файлов из других пакетов: