Tarkibga o'tish

Konsoldan ma’lumot kiritish

Hozirgacha dastur ishlatadigan qiymatlarni kodning ichida yozdik. Amaliy dastur esa ko‘pincha foydalanuvchidan ism, son yoki boshqa ma’lumotni qabul qilishi kerak.

Bu darsda terminaldan qiymat o‘qish, uni o‘zgaruvchiga saqlash va noto‘g‘ri kiritishni tekshirishni o‘rganamiz.

fmt.Scan() bilan qiymat o‘qish

Quyidagi dastur foydalanuvchidan yoshini so‘raydi:

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 chiqqach, masalan, 25 yozib Enter tugmasini bosing:

Yoshingizni kiriting: 25
Siz kiritgan yosh: 25

fmt.Print() matnni chiqaradi, lekin keyingi qatorga o‘tmaydi. Shu sababli foydalanuvchi qiymatni so‘rovning yoniga yozadi. fmt.Println() esa natijadan keyin yangi qatorga o‘tadi.

& belgisi nima qiladi?

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()ga manzil beriladi, chunki funksiya o‘qigan qiymatini aynan qaysi o‘zgaruvchiga yozishni bilishi kerak.

Hozircha &ni “qiymatni shu o‘zgaruvchiga yoz” degan ko‘rsatma sifatida tushunish yetarli. Xotira manzili va pointerlar keyingi alohida darsda batafsil tushuntiriladi.

Warning

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

Kiritishdagi xatoni tekshirish

Foydalanuvchi yosh o‘rniga salom deb yozishi mumkin. Bunday holatni tekshirmasak, dastur yoshning eski qiymati bilan davom etadi.

fmt.Scan() ikkita natija qaytaradi:

  • muvaffaqiyatli o‘qilgan qiymatlar soni;
  • kiritishda yuz bergan xato.
main.go
package main

import "fmt"

func main() {
    var yosh int

    fmt.Print("Yoshingizni kiriting: ")
    oqildi, err := fmt.Scan(&yosh)
    if err != nil {
        fmt.Println("Xato: yoshni butun son bilan kiriting.")
        return
    }

    fmt.Println("O‘qilgan qiymatlar soni:", oqildi)
    fmt.Println("Yoshingiz:", yosh)
}

To‘g‘ri qiymat kiritilsa:

Yoshingizni kiriting: 25
O‘qilgan qiymatlar soni: 1
Yoshingiz: 25

Matn kiritilsa:

Yoshingizni kiriting: salom
Xato: yoshni butun son bilan kiriting.

err != nil kiritishda xato borligini tekshiradi. return esa main() funksiyasini shu joyda tugatadi. if sharti keyingi darslarda batafsil tushuntiriladi; bu misolda uning vazifasi xato bo‘lsa dasturni davom ettirmaslik.

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 kenglik float64
    var balandlik float64

    fmt.Print("To‘rtburchak kengligi va balandligini kiriting: ")
    _, err := fmt.Scan(&kenglik, &balandlik)
    if err != nil {
        fmt.Println("Xato: ikkita son kiriting.")
        return
    }

    yuza := kenglik * balandlik
    fmt.Printf("Yuza: %.2f\n", yuza)
}

Kiritish va natija:

To‘rtburchak kengligi va balandligini kiriting: 5.5 3
Yuza: 16.50

_ bo‘sh identifikator (blank identifier) deyiladi. Bu misolda o‘qilgan qiymatlar soni kerak emas, shuning uchun uni _ orqali e’tiborsiz qoldirdik. Xatoni esa err orqali tekshirdik.

Qiymatlarni alohida qatorlarda ham kiritish mumkin:

To‘rtburchak kengligi va balandligini kiriting: 5.5
3
Yuza: 16.50

Bitta so‘zdan iborat matnni o‘qish

fmt.Scan() matnni bo‘sh joygacha o‘qiydi. Bitta so‘z, login yoki kod kabi qiymatlar uchun bu qulay:

main.go
package main

import "fmt"

func main() {
    var ism string

    fmt.Print("Ismingizni kiriting: ")
    _, err := fmt.Scan(&ism)
    if err != nil {
        fmt.Println("Ismni o‘qib bo‘lmadi:", err)
        return
    }

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

Natija:

Ismingizni kiriting: Ali
Salom, Ali!

Foydalanuvchi Ali Valiyev deb kiritsa, ismga faqat Ali yoziladi. To‘liq qator uchun boshqa usul kerak.

Bo‘sh joyli qatorni o‘qish

To‘liq ism yoki gap kabi bo‘sh joyli matnni bufio.Reader yordamida bir qator qilib o‘qish mumkin:

main.go
package main

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

func main() {
    oquvchi := bufio.NewReader(os.Stdin)

    fmt.Print("To‘liq ismingizni kiriting: ")
    ism, err := oquvchi.ReadString('\n')
    if err != nil {
        fmt.Println("Matnni o‘qib bo‘lmadi:", err)
        return
    }

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

Natija:

To‘liq ismingizni kiriting: Ali Valiyev
Salom, Ali Valiyev!

Bu dasturda:

  • os.Stdin terminaldan keladigan ma’lumot oqimini bildiradi;
  • bufio.NewReader() shu oqimdan qulay 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.

ReadString() Windows, Linux va macOS’da qatorni o‘qiydi. TrimSpace() qator oxiridagi farqlarni tozalaydi.

Scan() va qator o‘qishni aralashtirish

fmt.Scan() sonni o‘qiganda qator oxiridagi Enter belgisi kirish oqimida qolishi mumkin. Undan keyin ReadString('\n') ishlatilsa, u qolgan bo‘sh qatorni darhol o‘qib olishi ehtimoli bor.

Yangi boshlaganda bitta dastur ichida bir xil usuldan foydalanish qulay:

  • alohida so‘zlar va sonlar uchun fmt.Scan();
  • to‘liq qatorlar uchun bufio.Reader.

Murakkab kiritishda butun qatorni avval matn sifatida o‘qib, keyin kerakli turga aylantirish ishonchliroq bo‘ladi.

Kiritilgan qiymatni tekshirish

Qiymatning turi to‘g‘ri bo‘lishi uning mazmuni ham to‘g‘ri degani emas. Masalan, -5 butun son, ammo yosh sifatida yaroqsiz.

main.go
package main

import "fmt"

func main() {
    var yosh int

    fmt.Print("Yoshingizni kiriting: ")
    _, err := fmt.Scan(&yosh)
    if err != nil {
        fmt.Println("Xato: butun son kiriting.")
        return
    }

    if yosh < 0 || yosh > 150 {
        fmt.Println("Xato: yosh 0 dan 150 gacha bo‘lishi kerak.")
        return
    }

    fmt.Println("Qabul qilindi. Yoshingiz:", yosh)
}

Bu yerda ikki xil tekshiruv bor:

  1. Scan() qiymatni int sifatida o‘qiy oldimi;
  2. o‘qilgan son ruxsat etilgan oraliqdami.

Birinchisi kiritish xatosini, ikkinchisi esa qiymatning dastur qoidalariga mosligini tekshiradi. Tashqaridan kelgan ma’lumotga ishonishdan oldin ikkala tekshiruv ham muhim.

Xulosa

fmt.Scan() terminaldan bo‘sh joy bilan ajratilgan qiymatlarni o‘qiydi. Qiymat yoziladigan o‘zgaruvchi & bilan beriladi. Scan() qaytargan errni tekshirish noto‘g‘ri kiritishni aniqlashga yordam beradi. Bo‘sh joyli to‘liq qatorlar uchun bufio.Reader va ReadString() ishlatiladi.

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