முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 4 · பாடம் 4 இன் 5பாடத்திட்டத்தில் 19/50~12 min
தொகுதி பாடங்கள் (4/5)

சரங்கள், பைட்டுகள் மற்றும் ரூன்கள்

Go இல் string என்பது மாறாத பைட்டுகளின் வரிசையாகும். சரம் எழுத்துக்கள் UTF-8 இல் குறியாக்கம் செய்யப்பட்டுள்ளன. rune என்பது int32 மற்றும் ஒற்றை யூனிகோட் குறியீட்டு புள்ளி ஐ குறிக்கிறது.

பைட்டுகள் மற்றும் ரன்களுக்கு இடையிலான வேறுபாட்டைப் புரிந்துகொள்வது அவசியம் ஒரு சரத்தில் உச்சரிப்புகள், ஈமோஜிகள், ஐடியோகிராம்கள் அல்லது ஏதேனும் இருந்தால் பிழைகளைத் தவிர்க்கவும் 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] ஐ அட்டவணைப்படுத்துவது ஐ-வது பைட்டை (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, __INLINE_26...
  • strconv: Atoi, Itoa, ParseFloat, FormatInt...
  • unicode: IsLetter, IsDigit, ToUpper...
  • unicode/utf8: RuneCountInString (len([]rune(s))க்கு மாற்று).

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#go.m4.l4.e1
முயற்சிகள்: 0ஏற்றுகிறது…

%d %c ஐப் பயன்படுத்தி சரத்தை வரம்பு மற்றும் அச்சு அட்டவணை மற்றும் ரூன் மூலம் மீண்டும் செய்யவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

ஒரு சரத்தின் மீதான வரம்பு பைட்-ஆஃப்செட் + ரூன் திரும்பும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m4.l4.e2
முயற்சிகள்: 0ஏற்றுகிறது…

s ஐ []ரூனாக மாற்றி அதன் நீளத்தை எழுத்துக்களில் அச்சிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

வெளிப்படையான மாற்றம்: `[]ரூன்(கள்)`.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m4.l4.e3
தயார்

லென்("ciaò") என்றால் என்ன?

Go
s := "ciaò"
fmt.Println(len(s))
பதில் விருப்பங்கள்

மறுபரிசீலனை

  • string = மாறாத பைட்டுகளின் வரிசை, UTF-8 குறியிடப்பட்டது.
  • len(s) = பைட்டுகள்; s[i] = i-th பைட் (uint8).
  • for i, r := range s ரன்களை டிகோட் செய்கிறது; i என்பது பைட்-ஆஃப்செட்.
  • []rune(s) எழுத்தின்படி அட்டவணைப்படுத்த (செலவு, ஒதுக்கீடு).
  • மாற்ற: []byte அல்லது []rune வழியாகச் செல்லவும்.
  • லூப்பில் இணைக்க: strings.Builder.
  • முக்கிய தொகுப்புகள்: strings, strconv, unicode, unicode/utf8.