Вопрос проверяет понимание устройства строк в Go, их неизменяемости, работы с Unicode и эффективного использования.
Строка в Go — это неизменяемая последовательность байт. Внутренне она представлена структурой, содержащей указатель на массив байт и длину. Строки могут содержать любые байты, включая нулевые, и не обязаны быть валидным UTF-8. Однако по соглашению строки обычно содержат текст в кодировке UTF-8.
Строки неизменяемы: после создания изменить отдельные символы нельзя. Любая операция, которая кажется изменяющей строку (например, конкатенация), создает новую строку. Это обеспечивает безопасность и упрощает работу с памятью.
s := "hello"
// s[0] = 'H' // Ошибка: нельзя изменить
s2 := "H" + s[1:] // Создаем новую строкуДля работы с символами Unicode используется тип rune (алиас для int32). Цикл for range по строке итерирует по рунам, а не по байтам. Это важно для корректной обработки многобайтовых символов.
s := "Привет"
for i, r := range s {
fmt.Printf("%d: %c\n", i, r)
}
// Вывод: 0: П, 2: р, 4: и, 6: в, 8: е, 10: тСтроку можно преобразовать в срез байт ([]byte) и обратно. Это полезно для модификации данных, но требует копирования, так как строки неизменяемы.
b := []byte("hello")
b[0] = 'H'
s := string(b) // "Hello"Конкатенация строк через оператор + может быть неэффективной для большого количества операций, так как создает новые строки. Для частой конкатенации используйте strings.Builder.
var sb strings.Builder
for i := 0; i < 1000; i++ {
sb.WriteString("a")
}
s := sb.String()Строки в Go — это простой и безопасный способ работы с текстом, основанный на неизменяемости и UTF-8. Их следует использовать для хранения и передачи текстовых данных, а для сложных манипуляций с символами применять rune и strings.Builder.