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:
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:
Ismingizni kiriting: Ali
Salom, Ali!
Yuqoridagi kodda:
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'rinameo'zgaruvchisi saqlanayotgan xotira yacheykasiga yoziladi.
Go tilida foydalanuvchidan ma'lumot olishning uchta asosiy varianti mavjud:
fmt.Scan()fmt.Scanln()fmt.Scanf()fmt.Scan() funksiyasi kiritilgan ma'lumotlarni bo'sh joygacha (probelgacha) o'qiydi. Ya'ni probel uchraganda, probelgacha bo'lgan qism berilgan o'zgaruvchiga yuklanadi.
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:
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.
Bir nechta o'zgaruvchilarni bitta fmt.Scan() orqali qabul qilish mumkin:
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):
Ismingiz va yoshingizni kiriting:
Ali
25
Ism: Ali
Yosh: 25
2-usul (Bitta qatorda probel bilan ajratish):
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.
fmt.Scanln() funksiyasi ma'lumotlarni yangi qatorgacha (\n, Enter tugmasigacha) o'qiydi. Agar foydalanuvchi Enter tugmasini bossa, funksiya kiritishni darhol to'xtatadi.
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:
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:
Ismingiz va yoshingizni kiriting:
Ali 25
Ism: Ali
Yosh: 25
fmt.Scanf() funksiyasi Scanln() ga o'xshaydi, lekin u ma'lumotlarni format spetsifikatorlari (format specifiers) orqali aniq qolip bo'yicha qabul qiladi.
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:
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.fmt.Scanf() yordamida o'nlik kasrli sonlar (%g yoki %f) va mantiqiy qiymatlarni (%t) ham qabul qilish mumkin:
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:
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\nqo'yish (masalan,"%g\n") avvalgi qatordagi Enter belgisini tozalashga yordam beradi.