Проверяет понимание неизменяемости строк в Go и их внутреннего устройства.
В языке Go тип string является неизменяемым (immutable). Это означает, что после создания строки вы не можете изменить её содержимое по индексу или каким-либо другим способом. Строка в Go представляет собой структуру, состоящую из указателя на массив байтов и длины. Сам массив байтов, на который указывает строка, также не может быть изменён через эту строку.
Неизменяемость строк даёт несколько преимуществ:
package main
import "fmt"
func main() {
s := "hello"
// Попытка изменить символ по индексу вызовет ошибку компиляции
// s[0] = 'H' // ошибка: cannot assign to s[0]
// Для "изменения" строки нужно создать новую
s = "H" + s[1:] // создаётся новая строка "Hello"
fmt.Println(s) // Hello
// Строки можно сравнивать напрямую
a := "world"
b := "world"
fmt.Println(a == b) // true
}Если вам нужно изменить строку, вы можете преобразовать её в срез байтов ([]byte), который является изменяемым, внести изменения, а затем преобразовать обратно в строку. Однако это создаёт новую копию данных в памяти.
package main
import "fmt"
func main() {
s := "hello"
b := []byte(s) // создаётся копия данных
b[0] = 'H'
s = string(b) // создаётся новая строка
fmt.Println(s) // Hello
}Неизменяемость строк в Go — это фундаментальная особенность, которая обеспечивает безопасность и предсказуемость кода. При работе со строками важно помнить, что любые "изменения" на самом деле создают новые строки, что может влиять на производительность при частых операциях. Для интенсивной работы с текстом рекомендуется использовать strings.Builder или срезы байтов.