> Можно ли ограничить capacity слайса в Go, чтобы append всегда создавал новый массив (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Лига Цифровой Экономики

Стек: Go

> Пример ответа

Да, можно, но только косвенно. В Go нет встроенного способа зафиксировать capacity слайса на уровне типа - это всегда поле структуры reflect.SliceHeader. Однако можно добиться желаемого поведения, используя слайс с длиной, равной capacity. Например:

GO
s := make([]int, 5, 5) // len = 5, cap = 5
s = s[:5] // длина равна capacity

Теперь любой вызов append при попытке добавить элемент превысит текущую длину, и Go будет вынужден выделить новый массив, скопировав данные. Это гарантирует, что исходный массив не изменится.

Но важно понимать: это не "ограничение" в смысле запрета на изменение capacity, а лишь трюк с управлением длиной. Если вы хотите явно защититься от случайного изменения, можно обернуть слайс в структуру:

GO
type FixedSlice struct {
data []int
}
func (fs *FixedSlice) Append(v int) []int {
if len(fs.data) == cap(fs.data) {
newSlice := make([]int, len(fs.data)+1)
copy(newSlice, fs.data)
newSlice[len(fs.data)] = v
return newSlice
}
return append(fs.data, v)
}

Но в стандартной идиоме Go такое встречается редко - обычно полагаются на контроль длины.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью