Middle
Πώς είναι δομημένες οι συμβολοσειρές στη γλώσσα προγραμματισμού Go;
sobes.tech AI
Απάντηση από AI
Μία συμβολοσειρά στο Go είναι μια αμετάβλητη ακολουθία bytes.
Βασικά χαρακτηριστικά:
- Αμετάβλητο: μετά τη δημιουργία, η συμβολοσειρά δεν μπορεί να αλλάξει.
- Αναπαράσταση: αποθηκεύεται ως δείκτης και μήκος. Ο δείκτης δείχνει στο πρώτο byte της ακολουθίας στη μνήμη. Το μήκος είναι ο αριθμός των bytes.
- Κωδικοποίηση: οι συμβολοσειρές στο Go δεν περιέχουν πληροφορίες σχετικά με την κωδικοποίηση. Χρησιμοποιούνται συχνά για την αποθήκευση UTF-8, αλλά μπορούν να περιέχουν οποιοδήποτε byte.
- Επανάληψη σε bytes: ο βρόχος
for index, value range stringκατά την επανάληψη σε μια συμβολοσειρά επιστρέφει το index και το rune (int32), όχι το byte. - Επανάληψη σε runes: ένα rune αντιπροσωπεύει ένα Unicode code point. Το Go χρησιμοποιεί UTF-8, επομένως ένα rune μπορεί να καταλάβει από 1 έως 4 bytes.
- Απόκτηση υπο-συμβολοσειράς: η λειτουργία κοπής
string[start:end]δημιουργεί μια νέα συμβολοσειρά που δείχνει στην ίδια περιοχή μνήμης, αλλά με διαφορετικά όρια.
Παραδείγματα:
// Δήλωση και αρχικοποίηση
var s string
s = "Привет" // Λατινικός κυριολεκτικός σε Go - ακολουθία bytes,
// γενικά ερμηνεύεται ως UTF-8
// Μήκος της συμβολοσειράς σε bytes
byteLength := len(s) // 12, καθώς "П", "р", "и", "в", "е", "т" είναι πολλαπλά bytes σε UTF-8
// Επανάληψη σε runes
runeCount := 0
for index, runeValue := range s {
// index - δείκτης αρχής του rune σε bytes
// runeValue - τιμή του rune (int32)
_ = index // χρήση ανώνυμου δείκτη _ για μη χρησιμοποιούμενες μεταβλητές
// fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount θα είναι 6
// Επανάληψη σε bytes
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - byte στη θέση i
_ = s[i] // χρήση ανώνυμου δείκτη _
// fmt.Printf("Byte στη θέση %d: %d\n", i, s[i])
byteCount++
}
// byteCount θα είναι 12
// Απόκτηση υπο-συμβολοσειράς (slice bytes)
// Σημαντικό: το slice bytes μπορεί να διακόψει μια πολλαπλά byte rune
// sub := s[0:5] // Αυτό μπορεί να είναι μη έγκυρη UTF-8 ακολουθία
// Χρήση πακέτων strings ή unicode/utf8 για ασφαλή εργασία με runes
Σύγκριση με slice bytes ([]byte):
| Χαρακτηριστικό | String | []byte |
|---|---|---|
| Μεταβλητότητα | Όχι | Ναι |
| Αναπαράσταση | Δείκτης + Μήκος | Δείκτης + Μήκος + Χωρητικότητα |
| Τύπος | Ενσωματωμένο primitive | Slice (κομμάτι) |
| Χρήση | Αμετάβλητο κείμενο | Μεταβλητά δεδομένα (bytes) |
Μετατροπή μεταξύ string και []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)