4-bo‘lim
Satrlar, runalar va baytlar
Satrning ichki tuzilishi, bayt va runa farqi, UTF-8, strings paketi, strings.Builder va strconv bilan o'tkazish.
Ushbu bo‘lim mundarijasi
Go da satr - bu baytlar ketma-ketligi, va u o'zgarmas. Shu ikki jumla ko'p narsani tushuntiradi.
Asosiy amallar #
package main
import (
"fmt"
"strings"
)
func main() {
ism := "Husanboy"
familiya := "Qodirov"
toliq := ism + " " + familiya
fmt.Println(toliq)
fmt.Println(len(toliq))
fmt.Println(strings.ToUpper(ism))
fmt.Println(strings.Contains(toliq, "Qodir"))
}
Husanboy Qodirov
16
HUSANBOY
true
len - bu baytlar soni. Lotin harflari uchun u belgilar soniga
teng, lekin doim emas - buni hozir ko'ramiz.
Bayt va runa #
package main
import "fmt"
func main() {
matn := "Go 🐹"
fmt.Println("Baytlar:", len(matn))
fmt.Println("Runalar:", len([]rune(matn)))
fmt.Println(matn[0])
fmt.Println(string(matn[0]))
}
Baytlar: 7
Runalar: 4
71
G
Bitta emoji to'rt bayt egallaydi, shuning uchun 4 ta belgi 7 ta baytga joylashgan.
matn[0] esa harfni emas, baytni qaytaradi - 71 bu G
harfining kodi.
matn[i] har doim bayt beradi. Agar matnda faqat lotin harflari
bo'lsa, bu muammo tug'dirmaydi.
Lekin emoji yoki boshqa alifbo bo'lsa, bitta belgi bir nechta baytdan
iborat bo'ladi va matn[0] o'sha belgining faqat birinchi
bo'lagini qaytaradi. Natijada buzuq belgi chiqadi.
To'g'ri yo'l ikkita:
for i, r := range matn- Go belgilarni o'zi ajratadi.[]rune(matn)- butun matnni belgilar massiviga aylantirish.
Ikkinchisi qulayroq, lekin yangi xotira talab qiladi.
| Tur | Asli | Nimani bildiradi |
|---|---|---|
byte | uint8 | Bitta bayt (0-255) |
rune | int32 | Bitta belgi (Unicode kodi) |
range bilan yurish #
package main
import "fmt"
func main() {
matn := "Go 🐹"
for i, r := range matn {
fmt.Printf("%d: %c (%d)\n", i, r, r)
}
}
0: G (71)
1: o (111)
2: (32)
3: 🐹 (128057)
Chap ustundagi sonlarga diqqat qiling: ular belgi tartibi emas, balki bayt o'rni. Uchta lotin belgisi 0, 1, 2 da turadi, emoji esa 3-baytdan boshlanadi va to'rt bayt egallaydi.
Shuning uchun matnda yana bir belgi bo'lganida, uning indeksi 4 emas,
7 bo'lardi. range bu hisobni o'zi yuritadi va har safar to'liq
runa beradi - aynan shu kerak bo'ladi.
%c - belgini o'zini chiqaradi, %d esa uning raqamli kodini.
Bu tasodif emas. UTF-8 ni Ken Tompson va Rob Payk o'ylab topgan - Go ning ikki yaratuvchisi, 1992-yilda.
Shuning uchun Go da UTF-8 qo'shimcha kutubxona emas, balki tilning
o'ziga kiritilgan: manba fayllari UTF-8 da yoziladi, range esa
runalarni o'zi ajratadi.
Boshqa ko'p tillar UTF-8 ni keyinchalik, og'riq bilan qo'shgan.
Satr o'zgarmas #
package main
import "fmt"
func main() {
matn := "salom"
yangi := "S" + matn[1:]
fmt.Println(matn)
fmt.Println(yangi)
harflar := []byte(matn)
harflar[0] = 'S'
fmt.Println(string(harflar))
}
salom
Salom
Salom
matn[0] = 'S' deb yozib bo'lmaydi - bu kompilyatsiya xatosi.
O'zgartirish kerak bo'lsa, []byte yoki []rune ga o'tkaziladi.
matn[1:] - kesma (slice): birinchi baytdan keyingi hamma narsa.
Kesmalarni 9-bo'limda batafsil ko'ramiz.
strings paketi #
package main
import (
"fmt"
"strings"
)
func main() {
matn := " Namangan, Andijon, Farg'ona "
toza := strings.TrimSpace(matn)
fmt.Printf("%q\n", toza)
qismlar := strings.Split(toza, ", ")
fmt.Println(qismlar, len(qismlar))
fmt.Println(strings.Join(qismlar, " | "))
fmt.Println(strings.HasPrefix(toza, "Naman"))
fmt.Println(strings.Index(toza, "Andijon"))
fmt.Println(strings.Replace(toza, "Andijon", "Buxoro", 1))
}
"Namangan, Andijon, Farg'ona"
[Namangan Andijon Farg'ona] 3
Namangan | Andijon | Farg'ona
true
10
Namangan, Buxoro, Farg'ona
| Funksiya | Nima qiladi |
|---|---|
TrimSpace | Chetdagi bo'shliqlarni oladi |
Split | Ajratgich bo'yicha bo'ladi |
Join | Bo'laklarni birlashtiradi |
Contains | Ichida bormi |
HasPrefix / HasSuffix | Boshlanadimi / tugaydimi |
Index | Birinchi uchrash o'rni (yo'q bo'lsa -1) |
Replace | Almashtiradi (oxirgi son - nechta) |
Fields | Bo'shliqlar bo'yicha bo'ladi |
strings.Replace(matn, "a", "b", 1) faqat birinchisini
almashtiradi. Hammasini almashtirish uchun oxirgi argument -1
bo'lishi kerak.
Buni unutmaslik uchun Go da alohida funksiya ham bor:
strings.ReplaceAll(matn, "a", "b"). Amalda ko'pincha shu
ishlatiladi.
Satrlarni birlashtirish #
package main
import (
"fmt"
"strings"
)
func main() {
shaharlar := []string{"Namangan", "Andijon", "Buxoro"}
var quruvchi strings.Builder
for i, sh := range shaharlar {
if i > 0 {
quruvchi.WriteString(", ")
}
quruvchi.WriteString(sh)
}
fmt.Println(quruvchi.String())
fmt.Println(quruvchi.Len())
}
Namangan, Andijon, Buxoro
25
Satr o'zgarmas bo'lgani uchun, natija += qism har safar
butunlay yangi satr yaratadi va eskisini tashlaydi.
Uch element uchun bu sezilmaydi. Lekin o'n ming element uchun dastur sezilarli sekinlashadi, chunki ish hajmi element sonining kvadratiga mutanosib o'sadi.
strings.Builder esa ichida bitta bufer saqlaydi va unga qo'shib
boradi. Agar ro'yxat tayyor bo'lsa, eng qisqa yo'l -
strings.Join(shaharlar, ", ").
Son va satr orasida #
package main
import (
"fmt"
"strconv"
)
func main() {
son := 42
matn := strconv.Itoa(son)
fmt.Println(matn + "!")
qayta, xato := strconv.Atoi("123")
fmt.Println(qayta+1, xato)
_, xato2 := strconv.Atoi("salom")
fmt.Println("Xato:", xato2)
kasr, _ := strconv.ParseFloat("3.14", 64)
fmt.Println(kasr * 2)
}
42!
124 <nil>
Xato: strconv.Atoi: parsing "salom": invalid syntax
6.28
Bu yerda Go ning muhim odati birinchi marta ko'rinadi: Atoi
ikkita qiymat qaytaradi - natija va xato.
Xato bo'lmasa, u nil bo'ladi. Xatolarni 14-bo'limda to'liq
o'rganamiz.
| Funksiya | Yo'nalish |
|---|---|
strconv.Itoa | int -> string |
strconv.Atoi | string -> int |
strconv.ParseFloat | string -> float64 |
strconv.FormatFloat | float64 -> string |
fmt.Sprintf | Istalgan tur -> string |
Sprintf - eng moslashuvchan yo'l #
package main
import "fmt"
func main() {
ism := "Nodira"
ball := 92.456
xabar := fmt.Sprintf("%s: %.1f ball", ism, ball)
fmt.Println(xabar)
fmt.Printf("%-10s|%5d|\n", "chap", 42)
fmt.Printf("%10s|%-5d|\n", "o'ng", 42)
}
Nodira: 92.5 ball
chap | 42|
o'ng|42 |
Sprintf - Printf bilan bir xil, faqat ekranga chiqarmaydi, balki
satr qaytaradi.
| Shablon | Ma'nosi |
|---|---|
%.1f | Kasrdan keyin 1 raqam |
%5d | Kamida 5 belgi, o'ngga tekislangan |
%-10s | Kamida 10 belgi, chapga tekislangan |
Taqqoslash #
package main
import (
"fmt"
"strings"
)
func main() {
a := "Salom"
b := "salom"
fmt.Println(a == b)
fmt.Println(strings.EqualFold(a, b))
fmt.Println(a < b)
fmt.Println(strings.ToLower(a) == strings.ToLower(b))
}
false
true
true
true
Satrlarni ==, <, > bilan to'g'ridan-to'g'ri taqqoslash mumkin -
Go da alohida equals metodi kerak emas.
a < b bayt kodlari bo'yicha solishtiradi. Katta harflar kichiklardan
oldin kelgani uchun "Salom" < "salom" rost bo'ladi.
- Ikki satrni
+bilan birlashtiring va uzunligini chiqaring. - Emoji qo'shilgan satrda
lenvalen([]rune(...))farqini ko'ring. rangebilan har bir belgi va uning kodini chiqaring.- Satrning birinchi harfini katta qilib o'zgartiring.
strings.Splitbilan ro'yxatni bo'lib,Joinbilan qayting.Replaceni1va-1bilan sinab, farqini ko'ring.strings.Builderbilan 5 ta so'zni birlashtiring.strconv.Atoiga noto'g'ri satr berib, xatoni chiqaring.Sprintfbilan jadval ko'rinishida tekislangan qator yasang.EqualFoldva==farqini ko'rsating.
Xulosa #
- Satr - o'zgarmas baytlar ketma-ketligi;
lenbaytlar sonini beradi. byte- bitta bayt,rune- bitta belgi (Unicode kodi).matn[i]bayt qaytaradi; belgilar uchunrangeyoki[]runeishlating.- UTF-8 ni Go ning ikki yaratuvchisi o'ylab topgan, shuning uchun u tilga chuqur kiritilgan.
stringspaketida kundalik hamma amal bor;ReplaceAll-Replace(..., -1)ning qisqa shakli.- Siklda satr qo'shish uchun
strings.Builder, tayyor ro'yxat uchunstrings.Join. strconv.Atoiikkita qiymat qaytaradi: natija va xato.- Satrlarni
==va<bilan to'g'ridan-to'g'ri taqqoslash mumkin.
Keyingi bo'limda shartlar va switch ni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.