Skip to content

Go package

Go dasturlash tilida package (paket) bu kodni modullashtirish va qayta foydalanish uchun qulay ko'rinishda yozish hisoblandi. Paketlar kodni tartibga solishga, takrorlanishdan qochishga va loyihani yaxshi tuzishga yordam beradi.

Paket (package) nima?

Paket bu Go fayllar to'plami bo'lib, ular bitta katalogda joylashgan va bitta package nomiga ega bo'ladi.

Paket yaratish qoidalari

  • Har bir .go fayl package qatori bilan boshlanishi kerak.
  • Bitta katalog ichidagi barcha .go fayllar bitta package ga tegishli bo'lishi kerak.
  • main paketi Go dasturini ishga tushirish uchun majburiy hisoblanadi.

Go paketlarining turlari

Go paketlari ikkita asosiy turga bo'linadi:

  • Asosiy paketlar (main package) – dastur ishga tushiriladigan paket.
  • Kutubxona paketlar (library packages) – boshqa paketlar tomonidan import qilinadigan kodlar.

main paketi va bajariluvchi kod (executable package)

Agar Go dasturi main package ni o'z ichiga olmasa, bajariluvchi (executable) fayl hosil bo'lmaydi.

main.go
package main

import "fmt"

func main() {
    fmt.Println("Go package bilan ishlash!")
}

Kodni go run main.go bilan ishga tushiring.

Natija:

Go package bilan ishlash!

Agar biz shu yerda package main emas boshqa nom berilsa nima sodir bo'ladi? Quyida tekshirib ko'ramiz:

main.go
package yangi_nom

import "fmt"

func main() {
    fmt.Println("Go package bilan ishlash!")
}

Natija:

package command-line-arguments is not a main package

Info

Har doim ishga tushiriladigan .go fayl main package bo'lishi shart!

Lokal paket(package) yozish

Package'lar qanday ishlashini yaxshi tushinish uchun, o'zimizni lokal packageimizni yozib ko'ramiz. Bizni lokal package sifatida kichik matematik kutubxona yozib ko'ramiz. Quyida loyihaning fayl va katalog strukturasini keltirib o'tamiz.

Loyiha strukturasi
mening_loyiham/
│── main.go
└── matematika/
    ├── hisobla.go

Quyida struktura bo'yicha har br=ir fayllarni yozib chiqamiz.

hisobla.go
package matematika

import "math"

func Qosh(a, b int) int {
    return a + b
}

func Kvadrat(n int) int {
    return int(math.Pow(float64(n), 2.0))
}
main.go
package main

import (
    "fmt"
    "mening_loyiham/matematika"
)

func main() {
    fmt.Println(matematika.Kvadrat(3))
    fmt.Println(matematika.Qosh(3, 2))

}

Yuqoridagi kodda "mening_loyiham/matematika" import qilingan. Bu yerda mening_loyiham go mod init mening_loyiham buyrug'i orqali yaratilgan mening_loyiham nomli modul hisoblanadi. Agar modul yaratilmasa, lokal kod paketlarini import qilib bo'lmaydi.

Endi esa main.go faylni ishga tushirib ko'ramiz:

go run main.go

Natija:

9
5

Packageni nomlash va funksiyalarni eksport qilish

Paket nomlash qoidalari

  • Paket nomlari katalog nomi bilan bir xil bo'lishi tavsiya etiladi.
  • Kichik harflardan foydalanish afzal (matematika, utils).

Funksiyalarni eksport qilish

Funksiyani eksport qilish deganda, biror package ichida yozilgan funksiyani dasturning boshqa qismida import qilib ishlatish imkoniyati nazarda tutiladi.

Go tilida funksiyalarni eksport qilish uchun ularning nomi bosh harf bilan boshlanishi kerak. Agar funksiya kichik harf bilan boshlangan bo'lsa, u faqat o'sha package ichida ishlaydi va tashqaridan chaqirib bo'lmaydi.

hisobla.go
package matematika

import "math"

func Qosh(a, b int) int {
    return a + b
}

func Kvadrat(n int) int {
    return int(math.Pow(float64(n), 2.0))
}

func ayir(a, b int) int {
    return a - b
}

Bu yerda ayir deb nomlangan funksiyani main.go ichida chaqirib bo'lmaydi. Quyidagi xatolik sodir boladi.

.\main.go:11:25: undefined: matematika.ayir