Пакеты и модули

Пакеты и их импорт

Последнее обновление: 24.12.2017

Весь код в языке Go организуется в пакеты. Пакеты представляют удобную организацию разделения кода на отдельные части или модули. Модульность позволяет определять один раз пакет с нужной функциональностью и потом использовать его многкратно в различных программах.

Код пакета располагается в одном или нескольких файлах с расширением go. Для определения пакета применяется ключевое слово package. Например:

package main
import "fmt"

func main() {
	
	fmt.Println("Hello Go")
}

В данном случае пакет называется main. Определение пакета должно идти в начале файла.

Есть два типа пакетов: исполняемые (executable) и библиотеки (reusable). Для создания исполняемых файлов пакет должен иметь имя main. Все остальные пакеты не являются исполняемыми. При этом пакет main должен содержать функцию main, которая является входной точкой в приложение.

Импорт пакетов

Если уже есть готовые пакеты с нужной нам функциональностью, которую мы хотим использовать, то для их использования мы можем их импортировать в программу с помощью оператора import. Например, в примере выше задействуется функциональность вывода сообщения на консоль с помощью функции Println, которая определена в пакете fmt. Соответственно чтобы использовать эту функцию, необходимо импортировать пакет fmt:

import "fmt"

Нередко программы подключают сразу несколько внешних пакетов. В этом случае можно последовательно импортировать каждый пакет:

package main
import "fmt"
import "math"

func main() {
	
	fmt.Println(math.Sqrt(16))	// 4
}

В данном случае подключается встроенный пакет math, который содержит функцию Sqrt(), возвращающую квадратный корень числа.

Либо чтобы сократить определение импорта пакетов можно заключить все пакеты в скобки:

package main
import (
	"fmt"
	"math"
)

func main() {
	
	fmt.Println(math.Sqrt(16))
}

Подобным образом мы можем импортирвать как встроенные пакеты, так и свои собственные. Полный список встроенных пакетов в Go можно найти по адресу https://golang.org/pkg/.

Пакет из нескольких файлов

Один пакет может состоять из нескольких файлов. Например, определим в папке два файла:

Multiple files in Go build

В файле factorial.go определим функцию для подсчета факториала:

package main

func factorial(n int) int {
	
	var result = 1
	for i:=1; i <= n; i++{
		result *= i
	}
	return result
}

Данный файл принадлежит пакету main.

В файле main.go используем функцию для вычисления факториала:

package main
import "fmt"

func main() {
	
	fmt.Println(factorial(4))
	fmt.Println(factorial(5))
}

Данный файл также принадлежит пакету main. Файлов может и быть и больше. Теперь скомпилируем из этих файлов программу. Для этого перейдем в консоли к папке проекта и выполним команду:

go build -o main.exe factorial.go main.go

Флаг -o указывает, как будет называться выходной файл - в данном случае main.exe. Затем идут все компилируемые файлы. После выполнения этой команды будет создан файл main.exe, который мы сможем запустить в консоли:

Компиляция файлов Go

Файлы в разных пакетах

Теперь рассмотрим другую ситуацию, когда файлы нашей программы разделены по разным пакетам. Определим в папке проекта каталог computation. Затем в каталог computation добавим следующий файл factorial.go:

package computation

func Factorial(n int) int {
	
	var result = 1
	for i:=1; i <= n; i++{
		result *= i
	}
	return result
}

Код файла factorial.go принадлежит пакету computation. Важно отметить, что название функции начинается с заглавной буквы. Благодаря этому данная функция будет видна в других пакетах.

Импорт пакетов в Go

И чтобы использовать функцию factorial, надо импортировать этот пакет в файле main.go:

package main
import (
	"fmt"
	"./computation"
)

func main() {
	
	fmt.Println(computation.Factorial(4))
	fmt.Println(computation.Factorial(5))
}

Путь "./computation" указывает, что пакет находится в папке computation.

Компиляция и выполнение программы осуществляется также как и ранее без необходимости указания всех файлов из других пакетов:

Компиляция проекта Go из разных пакетов
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850