Go tiliga Kirish
Go (yoki Golang) â Google tomonidan 2009-yilda yaratilgan, tezkor, sodda va samarali dasturlash tili. Server, cloud, va microservice ilovalar uchun juda mashhur.
⥠Tezlik
C/C++ ga yaqin tezlikda ishlaydi, lekin Python kabi yozish oson.
đ Xavfsiz
Statik typli, garbage collection bor â memory muammolari kam.
đ Concurrency
Goroutine orqali bir vaqtda minglab operatsiyalar bajarish mumkin.
đŚ Sodda
Faqat 25 ta kalit so'z â o'rganish juda oson!
O'rnatish
Go ni rasmiy saytdan yuklab oling: go.dev/dl
# Versiyani tekshirish go version # Natija: go version go1.22.0 linux/amd64 # Yangi proyekt yaratish mkdir mening-loyiham cd mening-loyiham go mod init mening-loyiham
Go fayl tuzilmasi
package main // har bir dastur main packagedan boshlanadi import "fmt" // fmt â formatlash kutubxonasi func main() { // dastur shu yerdan boshlanadi fmt.Println("Salom, Dunyo!") }
package nomi bilan boshlanadi. Bajariladigan dasturlar
uchun albatta package main bo'lishi kerak.Hello World va Dastur Ishlatish
Go dasturini yozish, kompilyatsiya qilish va ishga tushirishni o'rganamiz.
Dasturni ishga tushirish
# To'g'ridan to'g'ri ishga tushirish go run main.go # Kompilyatsiya qilib binary yaratish go build -o dastur main.go ./dastur
fmt paketi bilan ishlash
package main import "fmt" func main() { // Println â yangi satr bilan chiqaradi fmt.Println("Salom, Go!") // Printf â formatlangan chiqarish fmt.Printf("Yosh: %d, Ism: %s\n", 25, "Ali") // Sprintf â string hosil qiladi xabar := fmt.Sprintf("Harorat: %.1f°C", 36.6) fmt.Println(xabar) }
Format belgilari (Verbs)
| Verb | Ma'nosi | Misol |
|---|---|---|
| %d | Butun son | fmt.Printf("%d", 42) â 42 |
| %f | Float son | fmt.Printf("%.2f", 3.14) â 3.14 |
| %s | String | fmt.Printf("%s", "salom") â salom |
| %v | Har qanday qiymat | fmt.Printf("%v", true) â true |
| %T | Tur nomi | fmt.Printf("%T", 5) â int |
| %t | Boolean | fmt.Printf("%t", false) â false |
O'zgaruvchilar (Variables)
Go'da o'zgaruvchi e'lon qilishning bir necha usuli bor. Har birini misollar bilan ko'ramiz.
package main import "fmt" func main() { // 1-usul: var kalit so'zi bilan var ism string = "Kamol" var yosh int = 22 // 2-usul: turni avtomatik aniqlash var shahar = "Toshkent" // 3-usul: qisqa e'lon (:=) â eng ko'p ishlatiladigan narx := 150000.50 aktiv := true // Bir nechta o'zgaruvchi bir vaqtda x, y, z := 1, 2, 3 // Konstantalar (o'zgarmaydigan) const PI = 3.14159 const SAYT = "golang.org" fmt.Println(ism, yosh, shahar) fmt.Println(narx, aktiv) fmt.Println(x, y, z) fmt.Println(PI, SAYT) }
Nol qiymatlar (Zero Values)
var a int // 0 var b float64 // 0.0 var c string // "" (bo'sh string) var d bool // false
Ma'lumot Turlari
Go statik tipli til â har bir o'zgaruvchining turi kompilyatsiya vaqtida aniq bo'lishi kerak.
Asosiy turlar
| Tur | O'lcham | Diapazon / Misol |
|---|---|---|
| int | 32/64-bit | -2^63 dan 2^63-1 gacha |
| int8 | 8-bit | -128 dan 127 |
| int16 | 16-bit | -32768 dan 32767 |
| int32 (rune) | 32-bit | Unicode belgi |
| int64 | 64-bit | Katta sonlar uchun |
| float32 | 32-bit | 3.14 |
| float64 | 64-bit | 3.141592653589793 |
| string | â | "Salom Go" |
| bool | 1-bit | true / false |
| byte (uint8) | 8-bit | 0 dan 255 |
package main import "fmt" func main() { // Turni ko'rsatish a := 42 b := 3.14 c := "salom" d := true fmt.Printf("%T = %v\n", a, a) // int = 42 fmt.Printf("%T = %v\n", b, b) // float64 = 3.14 fmt.Printf("%T = %v\n", c, c) // string = salom fmt.Printf("%T = %v\n", d, d) // bool = true // Tur o'zgartirish (Type Conversion) son := 42 float := float64(son) matn := string([]byte("A")) fmt.Println(float, matn) // String uzunligi s := "Go tili" fmt.Println(len(s)) // 7 }
float64(son) deb yozish kerak.Operatorlar
Go'da arifmetik, taqqoslash va mantiqiy operatorlar.
package main import "fmt" func main() { // Arifmetik operatorlar a, b := 10, 3 fmt.Println(a + b) // 13 (qo'shish) fmt.Println(a - b) // 7 (ayirish) fmt.Println(a * b) // 30 (ko'paytirish) fmt.Println(a / b) // 3 (bo'lish) fmt.Println(a % b) // 1 (qoldiq) // Taqqoslash operatorlari â bool qaytaradi fmt.Println(a == b) // false fmt.Println(a != b) // true fmt.Println(a > b) // true fmt.Println(a <= b) // false // Mantiqiy operatorlar x, y := true, false fmt.Println(x && y) // false (VA) fmt.Println(x || y) // true (YOKI) fmt.Println(!x) // false (EMAS) // Qisqa yozuv operatorlari n := 5 n += 3 // n = n + 3 = 8 n++ // n = n + 1 = 9 n-- // n = n - 1 = 8 fmt.Println(n) }
if / else Shartli Operatorlar
Dasturda qaror qabul qilish â if, else if, else konstruktsiyalari.
package main import "fmt" func main() { ball := 75 // Oddiy if-else if ball >= 90 { fmt.Println("A'lo") } else if ball >= 70 { fmt.Println("Yaxshi") } else if ball >= 55 { fmt.Println("Qoniqarli") } else { fmt.Println("Qoniqarsiz") } // if bilan qisqa e'lon (scope ichida) if toq := ball % 2; toq != 0 { fmt.Println("Toq son") } else { fmt.Println("Juft son") } // Murakkab shart yosh := 20 pul := 500000 if yosh >= 18 && pul >= 100000 { fmt.Println("Kreditga ruxsat bor") } }
() kerak emas, lekin figurali qavslar
{ } majburiy!for Sikli
Go'da faqat for sikli bor â u while va do-while o'rnini ham bosadi!
package main import "fmt" func main() { // 1. Klassik for sikli for i := 0; i < 5; i++ { fmt.Printf("%d ", i) } fmt.Println() // 2. While kabi ishlash n := 1 for n <= 8 { fmt.Printf("%d ", n) n *= 2 } fmt.Println() // 3. Cheksiz sikl + break count := 0 for { count++ if count == 3 { break } } fmt.Println("Count:", count) // 4. continue â o'tkazib yuborish for i := 1; i <= 6; i++ { if i%2 == 0 { continue } fmt.Printf("%d ", i) } fmt.Println() // 5. range â slice/array ichida yurish mevalar := []string{"olma", "nok", "uzum"} for i, meva := range mevalar { fmt.Printf("%d: %s\n", i, meva) } }
switch Operatori
Go'da switch â if/else if zanjiridan ancha toza va qulay variant.
package main import "fmt" func main() { kun := 3 // Oddiy switch switch kun { case 1: fmt.Println("Dushanba") case 2: fmt.Println("Seshanba") case 3: fmt.Println("Chorshanba") case 4, 5: fmt.Println("Payshanba yoki Juma") default: fmt.Println("Dam olish kuni") } // Shartsiz switch (if-else o'rniga) ball := 85 switch { case ball >= 90: fmt.Println("A'lo (5)") case ball >= 70: fmt.Println("Yaxshi (4)") case ball >= 55: fmt.Println("Qoniqarli (3)") default: fmt.Println("Qoniqarsiz (2)") } // Tur tekshirish (type switch) var qiymat interface{} = "salom" switch v := qiymat.(type) { case int: fmt.Printf("int: %d\n", v) case string: fmt.Printf("string: %s\n", v) case bool: fmt.Printf("bool: %t\n", v) } }
break yozish shart emas â har bir case avtomatik
to'xtaydi. Keyingi casega o'tish uchun fallthrough kalit so'zi ishlatiladi.Funksiyalar (Functions)
Go'da funksiyalar â kodni modulga bo'lish va qayta ishlatish imkoni. Bir nechta qiymat qaytarish kabi kuchli xususiyatlar bor.
package main import "fmt" // Oddiy funksiya func salom(ism string) string { return "Salom, " + ism + "!" } // Bir nechta parametr func yig'indi(a, b int) int { return a + b } // Ko'p qiymat qaytarish (Go ning kuchli tomoni!) func bo'lish(a, b float64) (float64, error) { if b == 0 { return 0, fmt.Errorf("nolga bo'lish xatosi") } return a / b, nil } // Variadic funksiya (ixtiyoriy miqdorda argument) func jami(sonlar ...int) int { summa := 0 for _, s := range sonlar { summa += s } return summa } func main() { fmt.Println(salom("Dilnoza")) fmt.Println(yig'indi(15, 27)) natija, xato := bo'lish(10, 3) if xato != nil { fmt.Println("Xato:", xato) } else { fmt.Printf("%.4f\n", natija) } fmt.Println(jami(1, 2, 3, 4, 5)) // Anonim funksiya (lambda) kvadrat := func(x int) int { return x * x } fmt.Println(kvadrat(7)) }
Array, Slice va Map
Go'da ma'lumotlar to'plamini saqlash uchun array (qat'iy o'lchamli), slice (dinamik) va map (kalit-qiymat) ishlatiladi.
package main import "fmt" func main() { // âââ ARRAY (qat'iy o'lcham) âââ var sonlar [5]int = [5]int{10, 20, 30, 40, 50} fmt.Println(sonlar[0], sonlar[2]) // âââ SLICE (dinamik, ko'p ishlatiladigan) âââ mevalar := []string{"olma", "nok", "gilos"} // Qo'shish mevalar = append(mevalar, "shaftoli", "qovun") fmt.Println(mevalar) fmt.Println("Uzunlik:", len(mevalar)) // Slicing (kesma olish) fmt.Println(mevalar[1:4]) // [nok gilos shaftoli] fmt.Println(mevalar[:2]) // [olma nok] // make bilan slice yaratish raqamlar := make([]int, 3, 5) // uzunlik=3, sig'im=5 fmt.Println(raqamlar) // âââ MAP (kalit â qiymat) âââ talaba := map[string]int{ "matematika": 95, "fizika": 87, "inglizcha": 92, } fmt.Println(talaba["matematika"]) // Yangi qiymat qo'shish talaba["kimyo"] = 78 // Mavjudligini tekshirish ball, mavjud := talaba["biologiya"] if !mavjud { fmt.Println("Biologiya topilmadi, default:", ball) } // Barcha kalit-qiymatlarni ko'rish for fan, baho := range talaba { fmt.Printf("%s: %d\n", fan, baho) } // O'chirish delete(talaba, "kimyo") }
Struct va Metodlar
Struct â Go'da obyektga o'xshash tuzilma. Metodlar orqali unga funksionallik qo'shish mumkin.
package main import "fmt" // Struct e'loni type Talaba struct { Ism string Yosh int Baholar []int } // Metod â (receiver bilan funksiya) func (t Talaba) OrtachaBalll() float64 { if len(t.Baholar) == 0 { return 0 } summa := 0 for _, b := range t.Baholar { summa += b } return float64(summa) / float64(len(t.Baholar)) } // Pointer receiver â o'zgartirishlar saqlanadi func (t *Talaba) BaholarQo'sh(baho int) { t.Baholar = append(t.Baholar, baho) } func (t Talaba) Taqdim() string { return fmt.Sprintf("%s (%d yosh) â o'rtacha: %.1f", t.Ism, t.Yosh, t.OrtachaBalll()) } func main() { // Struct yaratish ali := Talaba{ Ism: "Ali Karimov", Yosh: 20, } ali.BaholarQo'sh(88) ali.BaholarQo'sh(95) ali.BaholarQo'sh(76) fmt.Println(ali.Taqdim()) // Struct array guruh := []Talaba{ {"Zulfiya", 19, []int{90, 85}}, {"Bobur", 21, []int{70, 80, 75}}, } for _, t := range guruh { fmt.Println(t.Taqdim()) } }
Goroutine va Channel
Go'ning eng kuchli tomoni â concurrency! Goroutine'lar bir vaqtda minglab vazifalarni bajarishga imkon beradi.
package main import ( "fmt" "sync" "time" ) func vazifa(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Vazifa %d boshlandi\n", id) time.Sleep(100 * time.Millisecond) fmt.Printf("Vazifa %d tugadi\n", id) } func main() { // âââ GOROUTINE âââ var wg sync.WaitGroup for i := 1; i <= 3; i++ { wg.Add(1) go vazifa(i, &wg) // "go" bilan goroutine! } wg.Wait() // hammasi tugashini kutish // âââ CHANNEL âââ ch := make(chan int) go func() { summa := 0 for i := 1; i <= 100; i++ { summa += i } ch <- summa // channelga jo'natish }() natija := <-ch // channeldan olish fmt.Println("1 dan 100 gacha yig'indi:", natija) // âââ BUFFERED CHANNEL âââ xabarlar := make(chan string, 2) xabarlar <- "birinchi" xabarlar <- "ikkinchi" fmt.Println(<-xabarlar) fmt.Println(<-xabarlar) // âââ SELECT âââ c1 := make(chan string) c2 := make(chan string) go func() { c1 <- "c1 tayyor" }() go func() { c2 <- "c2 tayyor" }() for i := 0; i < 2; i++ { select { case msg := <-c1: fmt.Println(msg) case msg := <-c2: fmt.Println(msg) } } }
đ Goroutine
go func() yozish kifoya â thread dan yengilroq, minglab goroutine ishlaydi.
đĄ Channel
Goroutine'lar orasida xavfsiz ma'lumot almashish uchun. make(chan int)
đ Select
Bir necha channelni kutish â qaysi biriga avval ma'lumot kelsa, o'sha ishlaydi.
đ WaitGroup
sync.WaitGroup â barcha goroutine'lar tugashini kutish uchun.
Siz Go tilining barcha asosiy mavzularini o'zdingiz! Endi real loyihalar yarating: REST API, CLI dastur, yoki microservice.
go.dev/tour
gobyexample.com
pkg.go.dev