В Go string
— это неизменяемая (immutable) последовательность байт, которая обычно представляет текст в кодировке UTF-8 (хотя технически может содержать любые байты).
Ключевые особенности:
type stringStruct struct {
str unsafe.Pointer // указатель на массив байт
len int // длина строки в байтах
}
\x00
), так как длина хранится отдельно.Нет, строки в Go неизменяемы. Попытка изменить отдельный символ приведет к ошибке компиляции:
s := "hello"
s[0] = 'H' // ошибка: cannot assign to s[0]
Однако можно:
[]byte
(для ASCII-символов) или []rune
(для Unicode), изменить и преобразовать обратно:
s := "hello"
bytes := []byte(s)
bytes[0] = 'H'
s = string(bytes) // "Hello"
При конкатенации строк (+
или fmt.Sprintf
) происходит аллокация новой памяти и копирование содержимого всех строк. Это может быть неэффективно при частых операциях.
Примеры:
s1 := "Hello"
s2 := "World"
result := s1 + " " + s2 // создается новая строка
Для эффективного соединения многих строк лучше использовать strings.Builder
:
var builder strings.Builder
builder.WriteString("Hello")
builder.WriteString(" ")
builder.WriteString("World")
result := builder.String() // более эффективно
Оптимизация компилятора: В простых случаях (конкатенация литералов или небольшого числа строк) компилятор может оптимизировать операцию.
При каждой конкатенации:
[]byte
или strings.Builder