Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: Go, strings, immutability, memory allocation, string internals

Почему при любом изменении строки в Go выделяется новая память?

Вопрос проверяет понимание неизменяемости строк в Go и механизма работы с памятью, что важно для написания эффективного кода.

Короткий ответ

Строки в Go неизменяемы (immutable) по дизайну языка. Это означает, что после создания строки её содержимое нельзя изменить. Любая операция, которая выглядит как изменение строки (например, конкатенация или замена символа), на самом деле создаёт новую строку в памяти. Такой подход обеспечивает безопасность, упрощает работу с горутинами и позволяет эффективно использовать строки в качестве ключей в map.

Длинный ответ

Неизменяемость строк в Go

В Go строки являются неизменяемыми (immutable) типами данных. Это фундаментальное свойство, заложенное в дизайн языка. Когда вы создаёте строку, она размещается в памяти, и её содержимое не может быть изменено. Любая операция, которая на первый взгляд модифицирует строку, на самом деле создаёт новую строку в новом участке памяти.

Почему это так?

Основные причины:

  • Безопасность: Неизменяемость предотвращает случайное изменение строки в одном месте, которое может повлиять на другие части программы, особенно при работе с горутинами.
  • Эффективность map: Строки часто используются как ключи в map. Неизменяемость гарантирует, что хеш ключа не изменится после вставки, что критически важно для корректной работы хеш-таблиц.
  • Простота: Упрощает модель памяти и делает код более предсказуемым.

Как это работает на практике?

Рассмотрим пример:

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Printf("%p\n", &s) // адрес переменной s
    
    s = s + " world"
    fmt.Printf("%p\n", &s) // адрес переменной s (тот же)
    
    // Но сама строка теперь указывает на новую область памяти
}

В этом примере переменная s остаётся той же, но её значение (указатель на данные строки) меняется. Старая строка "hello" остаётся в памяти до тех пор, пока сборщик мусора не освободит её.

Внутреннее устройство строки

Строка в Go — это структура из двух полей: указатель на массив байтов и длина. При создании новой строки выделяется новый массив байтов, и указатель в структуре строки обновляется.

type string struct {
    Data uintptr // указатель на данные
    Len  int     // длина строки
}

Вывод

Неизменяемость строк в Go — это осознанный компромисс между производительностью и безопасностью. Хотя каждая "модификация" строки требует выделения новой памяти, это делает код более надёжным и предсказуемым, особенно в многопоточных приложениях. Для частых изменений строк рекомендуется использовать strings.Builder или bytes.Buffer, которые работают с изменяемыми буферами.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

Ключевые слова

#Go

#strings

#immutability

#memory allocation

#string internals

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.