47 / 68

strconv

strconv paketi

strconv — Go standart kutubxonasidagi paket bo'lib, asosiy ma'lumot turlarini (int, float64, bool) satr (string) ko'rinishiga va aksincha, satrni bu turlarga aylantirish uchun ishlatiladi.

Masalan, foydalanuvchidan matn ko'rinishida kiritilgan sonni ("25") haqiqiy int turiga aylantirish yoki, aksincha, sonni ekranga matn sifatida chiqarish uchun ushbu paket zarur bo'ladi.

Paketdan foydalanish uchun uni dasturga import qilish kerak:

example.go
import "strconv"

1. Satrni songa aylantirish: Atoi()

Atoi() (ASCII to Integer) funksiyasi satrni butun songa (int) aylantiradi:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // satrni int turiga aylantiramiz
    num, err := strconv.Atoi("108")

    fmt.Println(num)
    fmt.Println(err)
}

Natija:

kod
108
<nil>

Atoi() ikkita qiymat qaytaradi: aylantirilgan son va xatolik (error). Agar aylantirish muvaffaqiyatli bo'lsa, err qiymati nil bo'ladi.

Agar satr son bo'lmasa

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num, err := strconv.Atoi("abc")

    fmt.Println("Son:", num)
    fmt.Println("Xatolik:", err)
}

Natija:

kod
Son: 0
Xatolik: strconv.Atoi: parsing "abc": invalid syntax

[!IMPORTANT] strconv bilan ishlaganda err qiymatini albatta tekshiring! Agar aylantirish muvaffaqiyatsiz bo'lsa, qaytgan son har doim 0 bo'ladi va buni sukut bo'yicha e'tiborsiz qoldirish dasturda yashirin xatoliklarga olib kelishi mumkin.


2. Sonni satrga aylantirish: Itoa()

Itoa() (Integer to ASCII) funksiyasi Atoi()ning teskarisi — butun sonni satrga aylantiradi:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // int turini string turiga aylantiramiz
    text := strconv.Itoa(255)

    fmt.Println(text)
    fmt.Printf("%T\n", text) // turi string ekanini tekshiramiz
}

Natija:

kod
255
string

[!NOTE] Sonni satrga fmt.Sprintf("%d", son) orqali ham aylantirish mumkin, lekin strconv.Itoa() bunga maxsus mo'ljallangan, tezroq va o'qish uchun qulayroq usuldir.


3. Turli sanoq sistemasidagi sonlar: ParseInt() va FormatInt()

Atoi()/Itoa() faqat 10-lik (decimal) sonlar bilan ishlaydi. Agar boshqa sanoq sistemasi (masalan, 16-lik — hexadecimal) bilan ishlash kerak bo'lsa, ParseInt() va FormatInt() funksiyalaridan foydalaniladi:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // "FF" ni 16-lik sanoq sistemasidan int64 ga aylantiramiz
    // parametrlar: satr, asos (base), bit hajmi (bitSize)
    num, _ := strconv.ParseInt("FF", 16, 64)
    fmt.Println(num) // 255

    // 255 ni 16-lik sanoq sistemasidagi satrga aylantiramiz
    text := strconv.FormatInt(255, 16)
    fmt.Println(text) // ff
}

Natija:

kod
255
ff

Bu yerda 16 — sanoq sistemasining asosi (2, 8, 10, 16 va h.k.), 64 esa natija qaysi bit hajmidagi (int64) songa sig'ishi kerakligini bildiradi.


4. Kasr sonlar bilan ishlash: ParseFloat()

Satrni kasr songa (float64) aylantirish uchun ParseFloat() ishlatiladi:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // "64" — natijaning bit hajmi (float64 uchun)
    price, err := strconv.ParseFloat("3.14", 64)

    fmt.Println(price)
    fmt.Println(err)
}

Natija:

kod
3.14
<nil>

Kasr sonni orqaga satrga aylantirish uchun strconv.FormatFloat() yoki oddiygina strconv.Itoa()ga o'xshab fmt.Sprintf("%.2f", price) dan foydalanish mumkin.


5. Mantiqiy qiymatlar bilan ishlash: ParseBool() va FormatBool()

"true", "false" kabi satrlarni haqiqiy bool turiga aylantirish uchun ParseBool() ishlatiladi:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // satrni bool turiga aylantiramiz
    isActive, _ := strconv.ParseBool("true")
    fmt.Println(isActive)

    // bool turini satrga aylantiramiz
    text := strconv.FormatBool(false)
    fmt.Println(text)
}

Natija:

kod
true
false

[!NOTE] ParseBool() "1", "t", "T", "TRUE", "true", "True" kabi bir nechta yozilish variantini ham true deb qabul qiladi (xuddi shunga mos ravishda false uchun ham).


6. Satrni maxsus belgilar bilan qo'shtirnoqqa olish: Quote()

Quote() funksiyasi satrni Go kod ko'rinishidagi qo'shtirnoqli satrga aylantiradi — bunda maxsus belgilar (masalan, tab, yangi qator) ham to'g'ri "escape" qilinadi:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    message := "Salom\tDunyo"

    // maxsus belgilarni ham ko'rsatib qo'shtirnoqqa oladi
    quoted := strconv.Quote(message)
    fmt.Println(quoted)

    // aksincha: qo'shtirnoqli satrni asl holiga qaytaradi
    original, _ := strconv.Unquote(quoted)
    fmt.Println(original)
}

Natija:

kod
"Salom\tDunyo"
Salom	Dunyo

Bu funksiya, masalan, log yozuvlarida yoki disk raskadrovka (debugging) chiqishlarida satr ichidagi ko'rinmas belgilarni (tab, yangi qator) aniq ko'rsatish uchun juda qulay.


7. Xatolikni batafsil tekshirish: strconv.NumError

strconv funksiyalari muvaffaqiyatsiz bo'lganda oddiy error emas, balki *strconv.NumError turidagi maxsus xatolikni qaytaradi. Uni turga aylantirib (type assertion), xatolik haqida batafsil ma'lumot olish mumkin:

example.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    _, err := strconv.Atoi("12a")

    // xatolikni *strconv.NumError turiga aylantiramiz
    if numErr, ok := err.(*strconv.NumError); ok {
        fmt.Println("Qaysi funksiyada:", numErr.Func)
        fmt.Println("Qanday qiymatda:", numErr.Num)
        fmt.Println("Sabab:", numErr.Err)
    }
}

Natija:

kod
Qaysi funksiyada: Atoi
Qanday qiymatda: 12a
Sabab: invalid syntax

Bu usul, ayniqsa, foydalanuvchi kiritgan noto'g'ri ma'lumot haqida aniq va tushunarli xatolik xabari ko'rsatishda foydali.


Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Satrdan int ga (10-lik)strconv.Atoi(s)
int dan satrga (10-lik)strconv.Itoa(n)
Satrdan int64 ga (istalgan asosda)strconv.ParseInt(s, asos, bitHajmi)
int64 dan satrga (istalgan asosda)strconv.FormatInt(n, asos)
Satrdan float64 gastrconv.ParseFloat(s, 64)
Satrdan bool gastrconv.ParseBool(s)
bool dan satrgastrconv.FormatBool(b)
Satrni "escape" qilib qo'shtirnoqqa olishstrconv.Quote(s)