05 / 68

Take Input

Foydalanuvchidan ma'lumot qabul qilish

Go dasturlash tilida dastur ishlayotgan vaqtda foydalanuvchidan ma'lumotlarni (input) qabul qilish uchun fmt paketining Scan funksiyalaridan foydalanamiz.

Oddiy misol:

example.go
package main

import "fmt"

func main() {
    var name string

    // Foydalanuvchidan ismini kiritishni so'raymiz
    fmt.Print("Ismingizni kiriting: ")
    fmt.Scan(&name)

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

Kiritish va Natija:

kod
Ismingizni kiriting: Ali
Salom, Ali!

Yuqoridagi kodda:

example.go
fmt.Scan(&name)

satrida fmt.Scan() foydalanuvchi kiritgan qiymatni qabul qilib, uni name o'zgaruvchisiga biriktiradi.

[!IMPORTANT] O'zgaruvchi nomi oldidagi & (ampersand) belgisi uning kompyuter xotirasidagi manzilini (pointer / ko'rsatkich) bildiradi. Ya'ni, kiritilgan ma'lumot to'g'ridan-to'g'ri name o'zgaruvchisi saqlanayotgan xotira yacheykasiga yoziladi.

Go tilida foydalanuvchidan ma'lumot olishning uchta asosiy varianti mavjud:

  • fmt.Scan()
  • fmt.Scanln()
  • fmt.Scanf()

1. Go fmt.Scan() funksiyasi

fmt.Scan() funksiyasi kiritilgan ma'lumotlarni bo'sh joygacha (probelgacha) o'qiydi. Ya'ni probel uchraganda, probelgacha bo'lgan qism berilgan o'zgaruvchiga yuklanadi.

example.go
package main

import "fmt"

func main() {
    var language string

    fmt.Print("Yoqtirgan dasturlash tilingiz: ")
    fmt.Scan(&language)

    fmt.Printf("Tanlangan til: %s\n", language)
}

Kiritish va Natija:

kod
Yoqtirgan dasturlash tilingiz: Go Dasturlash
Tanlangan til: Go

Bu yerda kiritilgan satr "Go Dasturlash" bo'lishiga qaramay, natijada faqat "Go" chiqdi. Chunki fmt.Scan() probelgacha bo'lgan qismini oladi, probeldan keyingi qismi esa kiritish oqimida qoladi.

Scan() orqali bir vaqtning o'zida bir nechta qiymat olish

Bir nechta o'zgaruvchilarni bitta fmt.Scan() orqali qabul qilish mumkin:

example.go
package main

import "fmt"

func main() {
    var name string
    var age int

    fmt.Println("Ismingiz va yoshingizni kiriting:")
    fmt.Scan(&name, &age)

    fmt.Printf("Ism: %s\nYosh: %d\n", name, age)
}

1-usul (Yangi qator bilan ajratish):

kod
Ismingiz va yoshingizni kiriting:
Ali
25
Ism: Ali
Yosh: 25

2-usul (Bitta qatorda probel bilan ajratish):

kod
Ismingiz va yoshingizni kiriting:
Ali 25
Ism: Ali
Yosh: 25

fmt.Scan() qiymatlar orasi probel yoki yangi qator (Enter) bilan ajratilgan bo'lishidan qat'i nazar, barcha belgilangan o'zgaruvchilarni navbatma-navbat to'ldiradi.


2. Go fmt.Scanln() funksiyasi

fmt.Scanln() funksiyasi ma'lumotlarni yangi qatorgacha (\n, Enter tugmasigacha) o'qiydi. Agar foydalanuvchi Enter tugmasini bossa, funksiya kiritishni darhol to'xtatadi.

example.go
package main

import "fmt"

func main() {
    var name string
    var age int

    fmt.Println("Ismingiz va yoshingizni kiriting:")
    fmt.Scanln(&name, &age)

    fmt.Printf("Ism: %s\nYosh: %d\n", name, age)
}

Kiritish va Natija:

kod
Ismingiz va yoshingizni kiriting:
Ali
Ism: Ali
Yosh: 0

Agar foydalanuvchi faqat "Ali" deb yozib Enter bossa, Scanln() shu qatorda to'xtaydi va age kiritilmay qolib, o'zining boshlang'ich standart qiymati 0 da qoladi.

Shuning uchun fmt.Scanln() bilan bir nechta qiymat olish uchun ular bitta qatorda probel bilan ajratib kiritilishi shart:

kod
Ismingiz va yoshingizni kiriting:
Ali 25
Ism: Ali
Yosh: 25

3. Go fmt.Scanf() funksiyasi

fmt.Scanf() funksiyasi Scanln() ga o'xshaydi, lekin u ma'lumotlarni format spetsifikatorlari (format specifiers) orqali aniq qolip bo'yicha qabul qiladi.

example.go
package main

import "fmt"

func main() {
    var name string
    var age int

    fmt.Println("Ismingiz va yoshingizni kiriting:")
    fmt.Scanf("%s %d", &name, &age)

    fmt.Printf("Ism: %s\nYosh: %d\n", name, age)
}

Kiritish va Natija:

kod
Ismingiz va yoshingizni kiriting:
Ali 25
Ism: Ali
Yosh: 25

Bu yerda:

  • %s — satr (string) turidagi ma'lumotni kutadi va uni name o'zgaruvchisiga yozadi.
  • %d — butun son (int) turidagi ma'lumotni kutadi va uni age o'zgaruvchisiga yozadi.

Float va Boolean turlaridagi ma'lumotlarni kiritish

fmt.Scanf() yordamida o'nlik kasrli sonlar (%g yoki %f) va mantiqiy qiymatlarni (%t) ham qabul qilish mumkin:

example.go
package main

import "fmt"

func main() {
    var temperature float32
    var sunny bool

    // Float qiymat kiritish
    fmt.Print("Hozirgi havo harorati: ")
    fmt.Scanf("%g\n", &temperature)

    // Boolean qiymat kiritish
    fmt.Print("Bugun quyoshlimi (true/false)? ")
    fmt.Scanf("%t", &sunny)

    fmt.Printf("Harorat: %g°C\nQuyoshlimi: %t\n", temperature, sunny)
}

Kiritish va Natija:

kod
Hozirgi havo harorati: 31.5
Bugun quyoshlimi (true/false)? true
Harorat: 31.5°C
Quyoshlimi: true

[!TIP] fmt.Scanf() funksiyasida bir nechta kiritish amallari ketma-ket bajarilayotganda, format satrining oxiriga \n qo'yish (masalan, "%g\n") avvalgi qatordagi Enter belgisini tozalashga yordam beradi.