cpp

Создание пользовательского пакета

Создадим пользовательский пакет с названием functions и вынесем определения функций и структур в отдельные файлы. Внутри каталога C:\book\packages создаем каталог functions. Перемещаем файл functions.go из каталога C:\book\packages в каталог C:\book\packages\functions и добавляем в файл код из листинга 12.4. Определение структуры Point вынесем в файл C:\book\packages\functions\point.go (листинг 12.5). Новый пакет подключим в основном файле main.go (листинг 12.3).

Листинг 12.3. Содержимое файла C:\book\packages\main.go

package main

import (
   "fmt"
   "exanple.com/mymodule/functions"
)

func main() {
   fmt.Println(functions.N)             // 10
   // К переменной k нет доступа
   // fmt.Println(functions.k)          // Ошибка!
   fmt.Println(functions.Sum(10, 20))   // 30
   // К функции test() нет доступа
   // fmt.Println(functions.test())     // Ошибка!
   functions.Print()                    // test() k=8
   user := functions.User{"Иван", 35}
   fmt.Println(user.Name)               // Иван
   fmt.Println(user.Age)                // 35
   // p := functions.Point{10, 20}      // Ошибка!
   p := functions.Point{}               // OK
   fmt.Println(p)                       // {0 0}
   // К полям x и y нет доступа
   // fmt.Println(p.x)                  // Ошибка!
   obj := functions.NewPoint(10, 20)
   fmt.Println(obj.GetX())              // 10
   fmt.Println(obj.GetY())              // 20
   obj.SetX(30)
   obj.SetY(40)
   fmt.Println(obj)                     // {30 40}
}

Листинг 12.4. Содержимое файла C:\book\packages\functions\functions.go

package functions

import "fmt"

var N int = 10                // Публичная переменная
var k int = 8                 // Приватная переменная

type User struct {            // Публичная структура
   Name string                // Публичное поле
   Age int                    // Публичное поле
}

func Sum(x int, y int) int { // Публичная функция
   return x + y
}
func Print() {               // Публичная функция
   fmt.Println(test())
}
func test() string {         // Приватная функция
   return fmt.Sprintf("test() k=%d", k)
}

Листинг 12.5. Содержимое файла C:\book\packages\functions\point.go

package functions

type Point struct {                // Публичная структура
   x, y int                        // Приватные поля
}
func NewPoint(x, y int) Point {    // Публичный метод
   if x < 0 || y < 0 {
      return Point{0, 0}
   }
   return Point{x, y}
}
func (p Point) GetX() int {        // Публичный метод
   return p.x
}
func (p Point) GetY() int {        // Публичный метод
   return p.y
}
func (p *Point) SetX(n int) {      // Публичный метод
   if n < 0 {
      return
   }
   p.x = n
}
func (p *Point) SetY(n int) {      // Публичный метод
   if n < 0 {
      return
   }
   p.y = n
}

Открываем командную строку и запускаем программу:

C:\book\packages>go run main.go
10
30
test() k=8
Иван
35
{0 0}
10
20
{30 40}

C:\book\packages>go build -o main.exe main.go

C:\book\packages>main.exe
10
30
test() k=8
Иван
35
{0 0}
10
20
{30 40}

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

Итак, подключение пользовательского пакета, расположенного внутри модуля, выполняется по следующей схеме:

import "<Название модуля>/<Название пакета>"

Пример:

import "exanple.com/mymodule/functions"

После импорта пакета нам доступны только публичные идентификаторы, объявленные внутри пакета. Напомню, что названия публичных идентификаторов начинаются с прописной буквы. Если название начинается со строчной буквы, то такой идентификатор является приватным и его можно будет использовать только внутри того же самого пакета. Приватные идентификаторы не импортируются, поэтому внутри файла main.go мы не имеем доступа к переменной k, к функции test(), а также к полям структуры Point.

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp