Выбор ответа Junior Слайсы и мапы изнутри спрашивают часто обновлено

append внутри функции и слайс снаружи

Вопрос

Что выведет код?

func add(s []int) { s = append(s, 4) }

func main() {
    s := []int{1, 2, 3}
    add(s)
    fmt.Println(s, len(s))
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: [1 2 3] 3. В add приходит копия заголовка. append меняет длину только у локальной копии s, у вызывающего len остаётся 3.

Варианты ответа

  1. [1 2 3 4] 4
  2. [1 2 3] 4
  3. [1 2 3 4] 3
  4. [1 2 3] 3правильный ответ

Разбор

В add приходит копия заголовка. append меняет длину только у локальной копии s, у вызывающего len остаётся 3. Даже если бы в массиве было место и четвёрка записалась туда, снаружи её не видно, потому что длина внешнего слайса 3. Чтобы изменения длины дошли наружу, функция возвращает новый слайс: s = add(s).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.