Package үндэс
Та Go-ийн олон суурилагдсан package — fmt, sync, time — ашиглаж ирлээ. Одоо өөрийн package үүсгэхийг сурна. Package нь кодыг логикоор хуваарилах, дахин ашиглах, бусдаас нуух гол механизм юм.
Package гэж юу вэ?
Package нь нэг буюу хэдэн .go файлын цуглуулга юм. Нэг хавтас = нэг package. Файлын эхэнд package нэр гэж зарлана:
// math/calculator.go
package math
// Нийтийн функц — том үсгээр эхэлдэг
func Add(a, b int) int {
return a + b
}
func Subtract(a, b int) int {
return a - b
}
// Хувийн функц — жижиг үсгээр эхэлдэг, зөвхөн энэ package дотор харагдана
func validate(n int) bool {
return n >= 0
}
Том үсгээр эхэлсэн нэр (Add, Subtract) нь exported — гаднаас хандаж болно.
Жижиг үсгээр эхэлсэн нэр (validate) нь unexported — зөвхөн тухайн package дотор харагдана.
Package ашиглах
Өөрийн package-г import ашиглан оруулна:
// main.go
package main
import (
"fmt"
"myproject/math" // өөрийн package
)
func main() {
result := math.Add(10, 5)
fmt.Println("10 + 5 =", result)
result = math.Subtract(10, 5)
fmt.Println("10 - 5 =", result)
// math.validate(5) — АЛДАА: unexported функц
}
Import замын эхний хэсэг нь module нэр (go.mod дотор тодорхойлогдсон).
Package-ийн файл бүтэц
Бодит төсөлд package-үүд хавтас болгон зохион байгуулагддаг:
myproject/
├── go.mod
├── main.go
├── math/
│ ├── calculator.go
│ └── calculator_test.go
├── stringutil/
│ ├── format.go
│ └── parse.go
└── models/
└── user.go
// stringutil/format.go
package stringutil
import "strings"
func Capitalize(s string) string {
if s == "" {
return s
}
return strings.ToUpper(s[:1]) + s[1:]
}
func Repeat(s string, n int) string {
return strings.Repeat(s, n)
}
init функц
Нэг package-д init нэртэй тусгай функц байж болно. Module ачааллах үед автоматаар ажилладаг:
package database
import "fmt"
var connection string
func init() {
// Package анх ачаалагдах үед нэг удаа ажиллана
connection = "localhost:5432"
fmt.Println("Өгөгдлийн сангийн тохиргоо дууслаа")
}
func GetConnection() string {
return connection
}
init нь параметр болон буцаах утгагүй. Нэг файлд хэд хэдэн init бичиж болно — тэдгээр нь дарааллаар ажилладаг.
Package alias — нэр өөрчлөх
Import хийх үед package-д өөр нэр өгч болно:
package main
import (
"fmt"
str "myproject/stringutil" // alias ашиглаж байна
_ "myproject/database" // зөвхөн init-ийг ажиллуулах
)
func main() {
fmt.Println(str.Capitalize("сайн уу"))
fmt.Println(str.Repeat("Go! ", 3))
}
_ нэртэй import нь package-ийг ашиглахгүй боловч зөвхөн init функцийг ажиллуулахад хэрэглэнэ. Өгөгдлийн сан, driver бүртгэлд их ашиглагддаг.
Дараагийн хичээлд:
Go module систем — go.mod, go.sum, гуравдагч талын package татаж ашиглах, версийн удирдлагыг судална.