Sobes.tech
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)