50 / 68

bytes

bytes paketi

bytes paketi []byte (bayt slaysi) turi ustida amallar bajarish uchun ishlatiladi. Uning ko'p funksiyalari strings paketidagilarga juda o'xshaydi — farqi shundaki, strings o'zgarmas (string) matn bilan, bytes esa o'zgaruvchan ([]byte) ma'lumot bilan ishlaydi.

[]byte ayniqsa fayllar, tarmoq orqali qabul qilingan ma'lumotlar yoki katta hajmdagi matnni samarali qayta ishlashda ko'p ishlatiladi, chunki uni xotirada nusxalamasdan bevosita o'zgartirish mumkin.

example.go
import "bytes"

1. Ikkita bayt slaysini solishtirish: Equal()

[]byte turini == operatori bilan bevosita solishtirib bo'lmaydi (Go bunga ruxsat bermaydi), shuning uchun bytes.Equal() ishlatiladi:

example.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    b1 := []byte("Salom")
    b2 := []byte("Salom")

    fmt.Println(bytes.Equal(b1, b2))
}

Natija:

kod
true

2. Qidirish va katta harfga o'tkazish: Contains(), HasPrefix(), ToUpper()

Bu funksiyalar strings paketidagi bir xil nomli funksiyalar bilan bir xil mantiqda ishlaydi, faqat string o'rniga []byte qabul qiladi va qaytaradi:

example.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    data := []byte("Go dasturlash tili")

    fmt.Println(bytes.Contains(data, []byte("dasturlash")))
    fmt.Println(bytes.HasPrefix(data, []byte("Go")))

    // ToUpper []byte qaytaradi, ekranga chiqarish uchun string() ga o'giramiz
    fmt.Println(string(bytes.ToUpper(data)))
}

Natija:

kod
true
true
GO DASTURLASH TILI

[!NOTE] fmt.Println([]byte{...}) bayt qiymatlarini raqamlar ko'rinishida (masalan, [71 79 32 68...]) chop etadi, matn sifatida emas. Ekranga o'qilishi mumkin bo'lgan matn sifatida chiqarish uchun har doim string(...) ga aylantirib chop eting.


3. Bo'lish: Split()

example.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    data := []byte("Go dasturlash tili")

    parts := bytes.Split(data, []byte(" "))

    for _, p := range parts {
        fmt.Println(string(p))
    }
}

Natija:

kod
Go
dasturlash
tili

4. Ortiqcha bo'shliqlarni tozalash: TrimSpace()

example.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    trimmed := bytes.TrimSpace([]byte("   salom   "))

    fmt.Println(string(trimmed))
}

Natija:

kod
salom

5. Samarali matn yig'ish: bytes.Buffer

strings.Builder faqat matn qo'shish uchun mo'ljallangan bo'lsa, bytes.Buffer undan ham kengroq imkoniyatlarga ega: unga matn, bayt, hatto formatlangan ma'lumot (fmt.Fprintf orqali) yozish mumkin, shuningdek undan o'qish (io.Reader sifatida) ham mumkin:

example.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    var buf bytes.Buffer

    buf.WriteString("Salom, ")
    buf.WriteString("Dunyo!")

    fmt.Println(buf.String()) // yig'ilgan matnni olish
    fmt.Println(buf.Len())    // hozirgi uzunligi (baytlarda)

    // buferni tozalab, qaytadan foydalanish mumkin
    buf.Reset()

    // Fprintf orqali to'g'ridan-to'g'ri formatlab yozish
    fmt.Fprintf(&buf, "%d + %d = %d", 2, 3, 5)
    fmt.Println(buf.String())
}

Natija:

kod
Salom, Dunyo!
13
2 + 3 = 5

[!IMPORTANT] bytes.Buffer — Goda io.Writer va io.Reader interfeyslarini bir vaqtda amalga oshiruvchi eng ko'p ishlatiladigan turlardan biri. Shu sababli u ko'plab kutubxona funksiyalariga (masalan, fmt.Fprintf, json.NewEncoder) to'g'ridan-to'g'ri "yozish manzili" sifatida berilishi mumkin — bu haqda io paketiga bag'ishlangan darsda batafsil to'xtalamiz.


Xulosa: strings bilan bytes orasidagi farq

stringsbytes
Ishlaydigan turstring (o'zgarmas)[]byte (o'zgaruvchan)
Qachon ishlatiladiOddiy matn bilan ishlashdaFayl/tarmoq ma'lumoti, katta hajmdagi matn bilan ishlashda
Yig'ish uchunstrings.Builderbytes.Buffer

Amaliy maslahat: agar aniq sabab yo'q bo'lsa (masalan, faylni o'qish natijasi allaqachon []byte ko'rinishida kelayotgan bo'lsa), oddiy matn bilan ishlashda strings paketini afzal ko'ring — u o'qishga osonroq va ko'pincha yetarli.