Весь код в языке 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/.
Один пакет может состоять из нескольких файлов. Например, определим в папке два файла:
В файле 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, который мы сможем запустить в консоли:
Теперь рассмотрим другую ситуацию, когда файлы нашей программы разделены по разным пакетам. Определим в папке проекта каталог 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. Важно отметить, что название функции начинается с заглавной буквы. Благодаря этому данная функция будет видна в других пакетах.
И чтобы использовать функцию factorial, надо импортировать этот пакет в файле main.go:
package main import ( "fmt" "./computation" ) func main() { fmt.Println(computation.Factorial(4)) fmt.Println(computation.Factorial(5)) }
Путь "./computation" указывает, что пакет находится в папке computation.
Компиляция и выполнение программы осуществляется также как и ранее без необходимости указания всех файлов из других пакетов: