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.
import "bytes"
Equal()[]byte turini == operatori bilan bevosita solishtirib bo'lmaydi (Go bunga ruxsat bermaydi), shuning uchun bytes.Equal() ishlatiladi:
package main
import (
"bytes"
"fmt"
)
func main() {
b1 := []byte("Salom")
b2 := []byte("Salom")
fmt.Println(bytes.Equal(b1, b2))
}
Natija:
true
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:
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:
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 doimstring(...)ga aylantirib chop eting.
Split()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:
Go
dasturlash
tili
TrimSpace()package main
import (
"bytes"
"fmt"
)
func main() {
trimmed := bytes.TrimSpace([]byte(" salom "))
fmt.Println(string(trimmed))
}
Natija:
salom
bytes.Bufferstrings.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:
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:
Salom, Dunyo!
13
2 + 3 = 5
[!IMPORTANT]
bytes.Buffer— Godaio.Writervaio.Readerinterfeyslarini 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 haqdaiopaketiga bag'ishlangan darsda batafsil to'xtalamiz.
strings bilan bytes orasidagi farqstrings | bytes | |
|---|---|---|
| Ishlaydigan tur | string (o'zgarmas) | []byte (o'zgaruvchan) |
| Qachon ishlatiladi | Oddiy matn bilan ishlashda | Fayl/tarmoq ma'lumoti, katta hajmdagi matn bilan ishlashda |
| Yig'ish uchun | strings.Builder | bytes.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.