Проверяет понимание escape-анализа в Go и того, как компилятор решает, будет ли переменная размещена в куче.
Escape-анализ — это оптимизация компилятора, которая определяет, может ли переменная выйти за пределы функции, в которой она создана. Если переменная «убегает» (escape), компилятор размещает её в куче, чтобы она была доступна после завершения функции. Если нет — переменная остаётся на стеке, что быстрее и не требует участия сборщика мусора.
Когда вы передаёте слайс в функцию и вызываете append, компилятор анализирует, может ли функция сохранить ссылку на этот слайс или его элементы. Например, если функция возвращает слайс или присваивает его в глобальную переменную, то исходный слайс должен быть в куче. Если append просто изменяет длину внутри функции и не возвращает результат, компилятор может оставить слайс на стеке.
func appendToSlice(s []int) []int {
s = append(s, 1)
return s
}
func main() {
s := []int{1, 2}
s = appendToSlice(s) // s убегает, потому что возвращается
}В этом примере слайс s передаётся в функцию, и результат возвращается, поэтому компилятор размещает его в куче. Если бы функция не возвращала слайс, а просто модифицировала его внутри, компилятор мог бы оставить его на стеке.
Понимание escape-анализа помогает писать более эффективный код: избегайте лишних возвратов слайсов, если это возможно, и старайтесь не передавать указатели на локальные переменные в другие горутины без необходимости. Это снижает нагрузку на GC и ускоряет выполнение.
Итог: escape-анализ — это автоматический механизм, который решает, где разместить переменную. Используйте его знание для оптимизации критических участков кода, но не усложняйте код ради микрооптимизаций.