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