דילוג לתוכן המרכזי
מודול 4 · שיעור 4 מתוך 519/50 בקורס~12 min
שיעורי מודול (4/5)

מחרוזות, בתים ורונים

ב-Go a string הוא רצף בלתי ניתן לשינוי של בתים. מילולי מחרוזת מקודדים ב-UTF-8. rune הוא כינוי עבור int32 ו מייצג נקודת קוד יחידה של Unicode.

הבנת ההבדל בין בתים ורונים חיונית הימנע מבאגים כאשר מחרוזת מכילה מבטאים, אימוג'ים, אידיאוגרמות או כל דבר אחר תו שאינו ASCII.

string = בתים, לא תווים

Go
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):

Go
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): אינדקס לכל תו

המרה מפורשת: מקצה פרוסה חדשה של רונים. יקר אבל לפעמים הכרחי:

Go
runes := []rune("ciaò")
fmt.Println(len(runes))    // 4
fmt.Println(string(runes[3])) // ò

string(runes) היא ההמרה ההפוכה: לוקח []rune ומפיק מחרוזת UTF-8.

מיתרים אינם ניתנים לשינוי

Go
s := "ciao"
// s[0] = 'C'   // ERROR: cannot assign to s[0]

כדי לבצע מוטציה, המר ל-[]byte או []rune, הפעל, המר בחזרה:

Go
b := []byte(s)
b[0] = 'C'
s = string(b)   // "Ciao"

שִׁרשׁוּר

האופרטור + עובד, אבל עבור שרשורים רבים בלולאה השתמש strings.Builder (יעיל יותר, מונע הקצאות ביניים):

Go
var sb strings.Builder
for i := 0; i < 5; i++ {
    sb.WriteString("ab")
}
fmt.Println(sb.String())   // "ababababab"

חבילות שימושיות

  • strings: Contains, HasPrefix, Split, Join, ToUpper, Replace
  • strconv: Atoi, Itoa, ParseFloat, FormatInt...
  • unicode: IsLetter, IsDigit, ToUpper...
  • unicode/utf8: RuneCountInString (חלופה ל-len([]rune(s))).

נסה את זה

פעילות גופנית#go.m4.l4.e1
ניסיונות: 0טוען...

חזור על המחרוזת s עם טווח ואינדקס הדפסה ורונה באמצעות %d %c.

טוען עורך...
הצג רמז

טווח מעל מחרוזת מחזיר בתים היסט + רונה.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m4.l4.e2
ניסיונות: 0טוען...

המר s ל-[]rune והדפיס את אורכו בתווים.

טוען עורך...
הצג רמז

המרה מפורשת: `[]rune(s)`.

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m4.l4.e3
מוכן

מה זה len("ciaò")?

Go
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.