Tarkibga o'tish

Konsoldan ma'lumot kiritish

Bundan oldingi qismlarda dastur ishlatadigan qiymatlarni kodning ichida yozdik. Asosan dasturlar foydalanuvchidan ism, son yoki boshqa ma'lumotlarni qo'lda kiritishini so'raydi.

Bu qismda shu ishni terminalda amalga oshirishni va uni o'zgaruvchiga biriktirishni o'rganamiz.

Termenaldan ma'lumotni olish uchun fmt paketida fmt.Scan() funksiyasi bor. Shu funksiya bilan qiymatlarni o'qib olish mumkin.

main.go
package main

import "fmt"

func main() {
    var yosh int

    fmt.Print("Yoshingizni kiriting: ")
    fmt.Scan(&yosh)

    fmt.Println("Siz kiritgan yosh:", yosh)
}

Dasturni ishga tushiring:

go run main.go

Terminalda so'rov chiqganidan so'ng 25 yozib Enter tugmasini bosing:

Natija quyidagicha bo'lishi kerak:

Yoshingizni kiriting: 25
Siz kiritgan yosh: 25

Info

fmt.Print() matnni chiqaradi, lekin yangi qator qo'shmaydi. Shu sababli foydalanuvchi qiymatni so'rovning yoniga yozadi. fmt.Println() esa natijadan keyin yangi qator qo'shardi.

Keling endi yuqoridagi dasturni tushunishga harakat qilamiz:

var yosh int o'zgaruvchini yaratadi va unga 0 nol qiymatini beradi. fmt.Scan(&yosh) terminaldan qiymat o'qib, uni shu o'zgaruvchiga yozadi.

&yoshyosh o'zgaruvchisining xotiradagi manzili. Scan() qiymat sifatida o'zgaruvchining xotiradagi manzilini qabul qiladi.

Warning

fmt.Scan(yosh) emas, fmt.Scan(&yosh) yoziladi. & bo'lmasa, Scan() o'zgaruvchiga yangi qiymat yoza olmaydi va xato qaytaradi.

Info

Xotira manzili haqida mana bu Kompyuter va Operatsion tizim maqolasida tanishishingiz mumkin.

Hozircha &ni qiymatni shu o'zgaruvchi turgan manzilga yoz degan ko'rsatma sifatida tushunish yetarli. Xotira manzili va pointerlar keyingi alohida qismda batafsil tushuntiriladi.

Bir nechta qiymat o'qish

Scan()ga bir nechta o'zgaruvchining manzilini berish mumkin. Qiymatlar terminalda bo'sh joy yoki yangi qator bilan ajratiladi:

main.go
package main

import "fmt"

func main() {
    var eni float64
    var balandlik float64

    fmt.Print("To'rtburchak eni va balandligini kiriting: ")
    fmt.Scan(&eni, &balandlik)
    yuza := eni * balandlik
    fmt.Printf("Yuza: %.2f\n", yuza)
}

Natija:

To'rtburchak eni va balandligini kiriting: 5.5 3
Yuza: 16.50

Qiymatlarni alohida qatorlarda ham kiritish mumkin:

To'rtburchak eni va balandligini kiriting: 5.5
3
Yuza: 16.50

fmt.Scan() matnlarni o'qishda bo'sh joygacha o'qiydi. Ya'ni bitta so'z:

main.go
package main

import "fmt"

func main() {
    var ism string

    fmt.Print("Ism va familyangizni kiriting: ")
    fmt.Scan(&ism)

    fmt.Printf("Salom, %s!\n", ism)
}

Natija:

Ism va familyangizni kiriting: Ali
Salom, Ali!

Foydalanuvchi Ali Valiyev deb kiritsa, ismga faqat Ali yoziladi. To'liq qator uchun boshqa boshqa funksiyadan foydalanish kerak.

To'liq ism yoki uzun matnlarni bufio.Reader yordamida bir qator qilib o'qish mumkin:

main.go
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Ism va familiyangizni kiriting: ")

    ism, _ := reader.ReadString('\n')
    ism = strings.TrimSpace(ism)

    fmt.Printf("Salom, %s!\n", ism)
}

Natija:

Ism va familyangizni kiriting: Ali Valiyev
Salom, Ali Valiyev!

Bu dasturda:

  • os.Stdin terminaldan keladigan ma'lumot oqimini bildiradi;
  • bufio.NewReader() shu oqimdan o'qish vositasini yaratadi;
  • ReadString('\n') Enter bosilganda keladigan yangi qator belgisigacha o'qiydi;
  • strings.TrimSpace() matn boshidagi va oxiridagi bo'sh joy hamda yangi qator belgisini olib tashlaydi.

Info

reader.ReadString('\n') ikkita qiymat qaytaradi. Foydalanuvchi kiritgan matn va o‘qish vaqtida yuz berishi mumkin bo‘lgan xatolik. ism, _ := ... qismida matn ism o‘zgaruvchisiga saqlanadi, _ esa xatolik qiymatini e’tiborsiz qoldiradi. Goda _ bo‘sh identifikator deb ataladi. Funksiyalar va xatoliklar bilan ishlash qismlarida bular haqida chuqurroq o'rganamiz.

Keyingi darsda operatorlar va kiritilgan sonlardan foydalanib sodda matematik hisob-kitoblarni ko'rib chiqamiz.

Misollar

1. Ikki sonni bitta qatordan o‘qish

package main

import "fmt"

func main() {
    var a, b int
    fmt.Print("Ikki son kiriting: ")
    fmt.Scan(&a, &b)
    fmt.Println("Yig‘indi:", a+b)
}

fmt.Scan() qiymatlarni bo‘sh joy yoki yangi qator bilan ajratib o‘qiydi. &a va &b kiritilgan qiymatlar qayerga yozilishini ko‘rsatadi.

2. Kasrli sonni o‘qish

package main

import "fmt"

func main() {
    var narx float64
    fmt.Print("Narx: ")
    fmt.Scan(&narx)
    fmt.Printf("Narx: %.2f\n", narx)
}

float64 uchun kasr ajratuvchi nuqta bilan yoziladi: 12.5.

3. Ha yoki yo‘q qiymatini o‘qish

package main

import "fmt"

func main() {
    var faol bool
    fmt.Print("Faolmi (true/false): ")
    fmt.Scan(&faol)
    fmt.Println(faol)
}

bool o‘zgaruvchiga true yoki false matni bevosita o‘qiladi.

4. Fscan bilan o‘qish manbasini ko‘rsatish

package main

import (
    "fmt"
    "os"
)

func main() {
    var son int
    fmt.Fscan(os.Stdin, &son)
    fmt.Println(son * son)
}

Fscan() ma’lumot manbasini alohida qabul qiladi. Bu yerda manba terminalni bildiruvchi os.Stdin.

5. Butun qatorni o‘qish

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Manzil: ")
    manzil, _ := reader.ReadString('\n')
    fmt.Println(strings.TrimSpace(manzil))
}

ReadString() bo‘sh joyli matnni ham qator oxirigacha saqlab oladi.

6. Scanner bilan qator o‘qish

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    fmt.Print("Izoh: ")
    scanner.Scan()
    fmt.Println("Qabul qilindi:", scanner.Text())
}

Scanner.Text() qator oxiridagi \n belgisini qo‘shmaydi.

7. Birinchi Unicode belgini o‘qish

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Bitta belgi: ")
    belgi, baytlar, _ := reader.ReadRune()
    fmt.Printf("Belgi: %c, UTF-8 hajmi: %d bayt\n", belgi, baytlar)
}

ReadRune() bitta Unicode belgini o‘qiydi. Ikkinchi natija shu belgi UTF-8 kodlashida necha bayt egallaganini bildiradi.

8. Scanln bilan bitta qatorni o‘qish

package main

import "fmt"

func main() {
    var ism, familiya string
    fmt.Print("Ism va familiya: ")
    fmt.Scanln(&ism, &familiya)
    fmt.Println("Salom,", ism, familiya)
}

Scanln() qiymatlarni faqat joriy qator oxirigacha o‘qiydi. Bu misolda ism va familiya alohida o‘zgaruvchilarga yoziladi.

9. Vergul bilan ajratilgan sonlarni o‘qish

package main

import "fmt"

func main() {
    var a, b int
    fmt.Print("a,b: ")
    fmt.Scanf("%d,%d", &a, &b)
    fmt.Println(a + b)
}

Scanf() kiritish formatini belgilashga imkon beradi. Bu misolda vergul majburiy ajratuvchi.

10. Kiritishlar sonini tekshirish

package main

import "fmt"

func main() {
    var eni, boyi int
    n, err := fmt.Scan(&eni, &boyi)
    fmt.Println("O‘qilgan qiymatlar:", n)
    fmt.Println("Xato:", err)
    fmt.Println("Yuza:", eni*boyi)
}

Scan() nechta qiymat muvaffaqiyatli o‘qilgani va yuz bergan xatoni ham qaytaradi. Keyingi darslarda bu natijalarni shart bilan tekshirish o‘rganiladi.