Junior
Πώς λειτουργούν οι συμβολοσειρές στη γλώσσα Go;
sobes.tech AI
Απάντηση από AI
Οι συμβολοσειρές στο Go είναι αμετάβλητες ακολουθίες byte. Αντιπροσωπεύουν ένα "κομμάτι byte" ([]byte) με εγγύηση αμεταβλητότητας.
Βασικά χαρακτηριστικά:
- Αμεταβλητότητα: Μετά τη δημιουργία, μια συμβολοσειρά δεν μπορεί να τροποποιηθεί. Οποιαδήποτε λειτουργία που φαίνεται να την τροποποιεί, στην πραγματικότητα δημιουργεί μια νέα συμβολοσειρά.
- Απεικόνιση: Προεπιλεγμένα, οι συμβολοσειρές στο Go αντιπροσωπεύουν κείμενο κωδικοποιημένο σε UTF-8. Ωστόσο, είναι απλώς ακολουθίες byte; η ερμηνεία ως UTF-8 γίνεται κατά την εργασία με runes.
- Runes: Οι χαρακτήρες Unicode στο Go αντιπροσωπεύονται από τον τύπο
rune, που είναι ένα ψευδώνυμο για τοint32. Η επανάληψη σε μια συμβολοσειρά μεrangeαποκωδικοποιεί αυτόματα το UTF-8 και παρέχει τις runes και τους αρχικούς δείκτες τους σε bytes. - Μήκος: Η συνάρτηση
len(s)επιστρέφει τον αριθμό των bytes στη συμβολοσειρά, όχι τον αριθμό των χαρακτήρων (runes). Για να πάρετε τον αριθμό των runes, χρησιμοποιήστε τοutf8.RuneCountInString(s)ή επαναλάβετε μεrange. - Σύνθεση: Για τη σύνδεση συμβολοσειρών, χρησιμοποιείται ο τελεστής
+. Αυτό δημιουργεί μια νέα συμβολοσειρά. Για αποδοτική σύνθεση πολλών συμβολοσειρών, προτείνεται η χρήση τουstrings.Builder.
Παραδείγματα:
// Δήλωση συμβολοσειράς
str := "Hello, 世界"
// Μήκος συμβολοσειράς (σε bytes)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1) (1) 世(3) 界(3))
// Επανάληψη σε runes
runeCount := 0
for index, runeValue := range str {
// index - αρχικός δείκτης της rune σε bytes
// runeValue - η rune
runeCount++
// fmt.Printf("Δείκτης: %d, Rune: %c (Τιμή: %d)\n", index, runeValue, runeValue)
}
// runeCount - αριθμός runes (9)
// Πρόσβαση σε byte με δείκτη
// Προσοχή: αυτό είναι byte, όχι χαρακτήρας!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Αρχικό byte του χαρακτήρα '世'
// Σύνθεση συμβολοσειρών
newStr := str + "!"
// Χρήση του strings.Builder για αποδοτική σύνθεση
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"