Весь код в языке Go организуется в пакеты. Пакеты представляют удобную организацию разделения кода на отдельные части или модули. Модульность позволяет определять один раз пакет с нужной функциональностью и потом использовать его многкратно в различных программах.
Код пакета располагается в одном или нескольких файлах с расширением go . Для определения пакета применяется ключевое слово package . Например:
package main import «fmt» func main()
В данном случае пакет называется main . Определение пакета должно идти в начале файла.
Есть два типа пакетов: исполняемые (executable) и библиотеки (reusable). Для создания исполняемых файлов пакет должен иметь имя main . Все остальные пакеты не являются исполняемыми. При этом пакет main должен содержать функцию main , которая является входной точкой в приложение.
Импорт пакетов
Если уже есть готовые пакеты с нужной нам функциональностью, которую мы хотим использовать, то для их использования мы можем их импортировать в программу с помощью оператора import . Например, в примере выше задействуется функциональность вывода сообщения на консоль с помощью функции Println, которая определена в пакете fmt . Соответственно чтобы использовать эту функцию, необходимо импортировать пакет fmt:
3. Импорт виртуальных моделей в программу
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()
Подобным образом мы можем импортирвать как встроенные пакеты, так и свои собственные. Полный список встроенных пакетов в Go можно найти по адресу https://golang.org/pkg/.
Пакет из нескольких файлов
Один пакет может состоять из нескольких файлов. Например, определим в папке два файла:
В файле factorial.go определим функцию для подсчета факториала:
package main func factorial(n int) int < var result = 1 for i:=1; i return result >
Импортирование и экспортирование
Импортировать открытые символы в приложение или экспортировать функции из библиотеки DLL можно двумя способами:
- с помощью файла определения модуля (DEF) при сборке библиотеки DLL;
- с помощью ключевых слов __declspec(dllimport) или __declspec(dllexport) в определении функции в основном приложении.
Использование файла DEF
Файл определения модуля (DEF) — это текстовый файл, содержащий один или несколько операторов модуля, описывающих различные атрибуты библиотеки DLL. Если вы не используете ключевое слово __declspec(dllimport) или __declspec(dllexport) для экспорта функций библиотеки DLL, то для библиотеки DLL требуется DEF-файл.
Импорт в программу
Использование ключевого слова __declspec
Чтобы код компилировался правильно, использовать ключевое слово __declspec(dllimport) необязательно, но оно позволяет компилятору создавать более качественный код. Происходит это потому, что компилятор может определить, существует ли функция в библиотеке DLL или нет, и создать код без косвенного обращения, которое обычно присутствует в вызове функции, происходящем через границу библиотеки DLL. Однако для импорта переменных, используемых в библиотеке DLL, необходимо применять __declspec(dllimport) .
При наличии надлежащего раздела EXPORTS в файле DEF ключевое слово __declspec(dllexport) не требуется. Ключевое слово __declspec(dllexport) было добавлено для упрощения экспорта функций из EXE- или DLL-файла без использования файла DEF.
Формат переносимых исполняемых файлов Win32 предназначен для сведения к минимуму числа страниц для фиксации импорта. Для этого все адреса импорта для любой программы помещаются в одном месте, которое называется таблицей адресов импорта. Это позволяет загрузчику при обращении к импортируемым функциям изменять только одну или две страницы.
Выберите действие
- Импорт в приложение
- Экспорт из библиотеки DLL
Источник: learn.microsoft.com