שיעורי מודול (4/5)
מחרוזות, בתים ורונים
ב-Go a string הוא רצף בלתי ניתן לשינוי של בתים. מילולי מחרוזת
מקודדים ב-UTF-8. rune הוא כינוי עבור int32 ו
מייצג נקודת קוד יחידה של Unicode.
הבנת ההבדל בין בתים ורונים חיונית הימנע מבאגים כאשר מחרוזת מכילה מבטאים, אימוג'ים, אידיאוגרמות או כל דבר אחר תו שאינו ASCII.
string = בתים, לא תווים
s := "ciaò"
fmt.Println(len(s)) // 5 — not 4!
fmt.Println(s[0]) // 99 ('c' as a byte)
fmt.Println(s[3]) // 195 (first byte of 'ò' in UTF-8)len(s) מחזירה את מספר בתים, לא תווים גלויים.
יצירת אינדקס של s[i] מחזירה את ה-i-byte (uint8), לא את התו.
for range חוזר על רונים
for i, r := range s מפענח את UTF-8 תוך כדי תנועה: i הוא היסט הבתים
של תחילת הרונה, r הוא הרונה (int32):
s := "ciaò"
for i, r := range s {
fmt.Printf("%d %c (U+%04X)\n", i, r, r)
}
// 0 c (U+0063)
// 1 i (U+0069)
// 2 a (U+0061)
// 3 ò (U+00F2) <- starts at byte 3, takes 2 bytes[]rune(s): אינדקס לכל תו
המרה מפורשת: מקצה פרוסה חדשה של רונים. יקר אבל לפעמים הכרחי:
runes := []rune("ciaò")
fmt.Println(len(runes)) // 4
fmt.Println(string(runes[3])) // òstring(runes) היא ההמרה ההפוכה: לוקח []rune ומפיק
מחרוזת UTF-8.
מיתרים אינם ניתנים לשינוי
s := "ciao"
// s[0] = 'C' // ERROR: cannot assign to s[0]כדי לבצע מוטציה, המר ל-[]byte או []rune, הפעל, המר בחזרה:
b := []byte(s)
b[0] = 'C'
s = string(b) // "Ciao"שִׁרשׁוּר
האופרטור + עובד, אבל עבור שרשורים רבים בלולאה השתמש
strings.Builder (יעיל יותר, מונע הקצאות ביניים):
var sb strings.Builder
for i := 0; i < 5; i++ {
sb.WriteString("ab")
}
fmt.Println(sb.String()) // "ababababab"חבילות שימושיות
strings:Contains,HasPrefix,Split,Join,ToUpper,Replacestrconv:Atoi,Itoa,ParseFloat,FormatInt...unicode:IsLetter,IsDigit,ToUpper...unicode/utf8:RuneCountInString(חלופה ל-len([]rune(s))).
נסה את זה
חזור על המחרוזת s עם טווח ואינדקס הדפסה ורונה באמצעות %d %c.
הצג רמז
טווח מעל מחרוזת מחזיר בתים היסט + רונה.
הפתרון זמין לאחר 3 ניסיונות
המר s ל-[]rune והדפיס את אורכו בתווים.
הצג רמז
המרה מפורשת: `[]rune(s)`.
הפתרון זמין לאחר 3 ניסיונות
מה זה len("ciaò")?
s := "ciaò"
fmt.Println(len(s))לְסַכֵּם
string= רצף בתים בלתי ניתן לשינוי, מקודד UTF-8.len(s)= בתים;s[i]= הבית ה-i (uint8).for i, r := range sמפענח רונים;iהוא היסט הבתים.[]rune(s)לאינדקס לפי תו (יקר, מקצה).- כדי לבצע מוטציה: עבור דרך
[]byteאו[]rune. - לשרשור בלולאה:
strings.Builder. - חבילות מפתח:
strings,strconv,unicode,unicode/utf8.