Влияние функции append на исходный слайс

Будет напечатано [A B TT E], затем [B TT]. Слайс b имеет длину 1, но capacity 3, поэтому append записывает TT в общий массив c.

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

Что ответить на собеседовании

Будет напечатано [A B TT E], затем [B TT]. Слайс b имеет длину 1, но capacity 3, поэтому append записывает TT в общий массив c.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой вывод будет у программы и выясните, изменит ли вызов append исходный слайс c. Также укажите, какие элементы окажутся в слайсе b после выполнения кода.

package main

import "fmt"

func main() {
    c := []string{"A", "B", "D", "E"}
    b := c[1:2]
    b = append(b, "TT")
    fmt.Println(c) // ?
    fmt.Println(b) // ?
}

Ответ

Будет напечатано [A B TT E], затем [B TT]. Слайс b имеет длину 1, но capacity 3, поэтому append записывает TT в общий массив c.

b начинается с c[1], следовательно его новая позиция 1 совпадает с c[2], где раньше было D. Длина c не меняется. Если нужно сохранить исходный массив при дописывании, используйте b := c[1:2:2]; для полной независимости также от прямых присваиваний нужна копия.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее