16-bo‘lim

Paketlar va modullar

Paket nomlari, katta harf orqali ko'rinuvchanlik, import yo'llari va taxalluslar, go.mod va go.sum, internal papkasi hamda init funksiyasi.

🕑 11 daqiqa o‘qish 📄 895 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ikki daraja
  2. Katta harf - ko'rinuvchanlik
  3. Import qilish
  4. Taxalluslar
  5. go.mod fayli
  6. go.sum nima uchun kerak
  7. internal papkasi
  8. init funksiyasi
  9. Hujjatlash
  10. Foydali standart paketlar
  11. Xulosa

Loyiha o'sgani sari kodni bo'lish kerak bo'ladi. Go da buning ikki darajasi bor: paket va modul.

Ikki daraja #

TushunchaNima
PaketBitta papkadagi fayllar to'plami
ModulBirga tarqatiladigan paketlar to'plami

Modul - bu go.mod fayli turgan papka va uning ichidagi hamma narsa.

Bitta modul, uchta paket modul: misol.uz/maktab go.mod modul nomi va bog'liqliklar main.go package main hisob/hisob.go package hisob internal/baza/baza.go faqat shu modul ichida import "misol.uz/maktab/hisob" - papka yo'li bilan chaqiriladi

Katta harf - ko'rinuvchanlik #

Go da public va private kalit so'zlari yo'q. Buning o'rniga nomning birinchi harfi hal qiladi.

Go
package hisob

// Qosh - tashqaridan ko'rinadi (katta harf)
func Qosh(a, b int) int {
    return a + b
}

// tekshir - faqat shu paket ichida (kichik harf)
func tekshir(son int) bool {
    return son >= 0
}

type Talaba struct {
    Ism  string // ko'rinadi
    ball int    // ko'rinmaydi
}

Bu qoida hamma narsaga taalluqli: funksiya, tur, o'zgaruvchi, doimiy va struktura maydonlari.

Bitta harf - butun qoida

Java da public, private, protected, package-private bor - to'rtta daraja va ularni yozish kerak.

Go da ikkita daraja bor va ular nomning o'zida ko'rinadi. Funksiyani o'qiyotganingizda, uning tashqariga chiqishini bilish uchun hech qayerga qarash kerak emas.

Bu 11-bo'limdagi JSON teglari bilan ham bog'liq: json paketi boshqa paketda turgani uchun, u faqat katta harfli maydonlarni ko'ra oladi.

Import qilish #

Go
package main

import (
    "fmt"
    "strings"

    "misol.uz/maktab/hisob"
)

func main() {
    fmt.Println(hisob.Qosh(2, 3))
    fmt.Println(strings.ToUpper("salom"))
}

Import yo'li - papkaning to'liq yo'li, paket nomi emas. Lekin kodda paket nomi ishlatiladi.

Odatda ular bir xil bo'ladi, shuning uchun chalkashlik kam.

gofmt importlarni ikki guruhga ajratadi: standart kutubxona yuqorida, qolganlari pastda.

Taxalluslar #

Go
import (
    "math/rand"

    krand "crypto/rand"

    _ "github.com/lib/pq"

    . "fmt"
)
ShaklMa'nosi
krand "crypto/rand"Boshqa nom berish
_ "..."Faqat init uchun import
. "fmt"Nomsiz ishlatish
Nuqtali importdan saqlaning

. "fmt" yozsangiz, Println ni to'g'ridan-to'g'ri yozish mumkin bo'ladi - fmt. siz.

Bu qulaydek tuyuladi, lekin kodni o'qishni buzadi: Println qayerdan kelganini bilib bo'lmaydi. Katta faylda bu jiddiy muammo.

Amalda uni deyarli hech kim ishlatmaydi. _ esa haqiqatan kerak bo'ladi - ma'lumotlar bazasi drayverlari o'zini shu yo'l bilan ro'yxatdan o'tkazadi.

go.mod fayli #

INI
module misol.uz/maktab

go 1.24

require (
    github.com/google/uuid v1.6.0
    golang.org/x/text v0.14.0 // indirect
)
QatorMa'nosi
moduleModul nomi (import yo'lining boshi)
goTil versiyasi
requireKerakli bog'liqliklar
// indirectBevosita ishlatilmaydi, bog'liqlikning bog'liqligi

Bog'liqlik qo'shish uchun uni kodda import qilib, keyin shu buyruqni berasiz:

Terminal
go mod tidy

go mod tidy kodni o'qib chiqadi: yetishmaydiganini yuklaydi, ortiqchasini olib tashlaydi.

go.sum nima uchun kerak #

go.sum - bu xavfsizlik

go.mod yonida go.sum fayli paydo bo'ladi. Uning ichida har bir bog'liqlikning kriptografik barmoq izi saqlanadi.

Keyingi safar kod yuklanganda, Go uning izini qayta hisoblab, go.sum bilan solishtiradi. Agar mos kelmasa, u qurishni to'xtatadi.

Bu nimadan himoya qiladi: kimdir omborga kirib, eski versiyaning kodini jimgina o'zgartirib qo'ysa, siz buni darhol bilasiz.

Shuning uchun go.sum ni ham albatta git ga qo'shing.

internal papkasi #

internal - Go dagi haqiqiy private

internal deb nomlangan papka maxsus: uning ichidagi paketlarni faqat shu modulning o'zi import qila oladi.

KOD
misol.uz/maktab/internal/baza    <- faqat maktab ichidan
misol.uz/maktab/hisob            <- hamma joydan

Boshqa modul internal ichidagi narsani import qilmoqchi bo'lsa, kompilyator rad etadi.

Bu nima uchun foydali: kutubxona yozayotganda ba'zi kod tashqariga chiqmasligi kerak, lekin u bir nechta ichki paketga bo'lingan bo'lishi mumkin. Katta harf bu yerda yordam bermaydi - internal esa aynan shu muammoni hal qiladi.

init funksiyasi #

Go
package main

import "fmt"

var sozlama = tayyorla()

func tayyorla() string {
    fmt.Println("1. o'zgaruvchi tayyorlandi")
    return "asosiy"
}

func init() {
    fmt.Println("2. init ishladi:", sozlama)
}

func main() {
    fmt.Println("3. main ishladi")
}
Natija
1. o'zgaruvchi tayyorlandi
2. init ishladi: asosiy
3. main ishladi

init - paket yuklanganda avtomatik chaqiriladigan funksiya. U main dan oldin ishlaydi.

Tartib qat'iy: avval paket o'zgaruvchilari, keyin init, keyin main.

init ni kam ishlating

Bitta faylda bir nechta init bo'lishi mumkin va ularni chaqirish tartibi doim ravshan emas.

Asosiy muammo - init yashirin ishlaydi. Kodni o'qiyotgan odam uni ko'rmasligi mumkin, lekin u dastur holatini o'zgartirib qo'yadi. Testlarda esa uni o'chirib bo'lmaydi.

Ko'p hollarda oddiy funksiya yozib, uni main da ochiq chaqirgan ma'qul.

Hujjatlash #

Go
// Package hisob oddiy matematik amallarni bajaradi.
package hisob

// Qosh ikki sonning yig'indisini qaytaradi.
//
// Salbiy sonlar ham qabul qilinadi.
func Qosh(a, b int) int {
    return a + b
}

Go da hujjat - bu oddiy izoh. Alohida sintaksis yo'q.

Qoida: izoh e'lon qilinayotgan nom bilan boshlanishi kerak - Qosh ikki sonning....

Keyin uni ko'rish mumkin:

Terminal
go doc misol.uz/maktab/hisob Qosh

Aynan shu izohlardan pkg.go.dev saytidagi hujjatlar yasaladi.

Foydali standart paketlar #

PaketNima uchun
fmtChiqarish va formatlash
stringsSatrlar
strconvTurlar orasida o'tkazish
errorsXatolar
slices / mapsKolleksiyalar
osFayllar va muhit
timeVaqt
encoding/jsonJSON
net/httpVeb server va mijoz
syncParallellik
testingTestlar
Go
package main

import (
    "fmt"
    "os"
    "strings"
    "time"
)

func main() {
    muddat := 90 * time.Minute
    fmt.Println(muddat)
    fmt.Println(muddat.Hours())

    yol := strings.Join([]string{"hujjatlar", "hisobot.txt"}, "/")
    fmt.Println(yol)

    fmt.Println(len(os.Args) > 0)
}
Natija
1h30m0s
1.5
hujjatlar/hisobot.txt
true

time.Duration ning String() metodi bor - shuning uchun 90 * time.Minute odam o'qiy oladigan shaklda chiqdi.

Vaqtni chiqarishda ehtiyot bo'ling

Bu misolda time.Now() ishlatilmadi, chunki u har safar boshqa natija berardi.

Xuddi shu sabab bilan bu darslikda tasodifiy sonlar, gorutina navbati va map tartibi ham hech qachon to'g'ridan-to'g'ri chiqarilmaydi.

Amaliy topshiriq
  1. go mod init bilan modul yarating.
  2. hisob papkasini ochib, unga paket yozing.
  3. Katta va kichik harfli funksiya yozib, farqini sinang.
  4. Paketni main dan import qilib ishlating.
  5. Import taxallusi bilan ikki paketni chaqiring.
  6. go mod tidy ni ishga tushiring va go.mod o'zgarishini ko'ring.
  7. go.sum faylini ochib, ichidagini ko'ring.
  8. internal papkasi yaratib, tashqaridan import qilishga urining.
  9. init funksiyasi yozib, chaqirilish tartibini kuzating.
  10. Funksiyaga izoh yozib, go doc bilan ko'ring.

Xulosa #

  • Paket - bitta papka; modul - go.mod bor papka va uning ichidagilar.
  • Ko'rinuvchanlikni nomning birinchi harfi hal qiladi: katta - tashqariga chiqadi.
  • Import yo'li - papka yo'li, kodda esa paket nomi ishlatiladi.
  • _ importi faqat init uchun; nuqtali importdan saqlaning.
  • go mod tidy bog'liqliklarni kod bo'yicha tartibga soladi.
  • go.sum bog'liqliklarning barmoq izini saqlaydi - uni ham git ga qo'shing.
  • internal papkasi faqat shu modul ichidan ko'rinadi.
  • init main dan oldin ishlaydi, lekin uni kam ishlating.
  • Hujjat - oddiy izoh; u e'lon qilinayotgan nom bilan boshlanadi.

Keyingi bo'limda generiklarni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.