//что выведет код?

Код:

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

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

Код:

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

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

Условие

//что выведет код? package main import "fmt"

func main() { nums := make([]int, 1, 2) fmt.Println(nums) //

appendSlice(nums, 1024)
fmt.Println(nums) //

mutateSlice(nums, 1, 512)
fmt.Println(nums) //

}

func appendSlice(sl []int, val int) { sl = append(sl, val) }

func mutateSlice(sl []int, idx, val int) { sl[idx] = val }

Ответ

Код:

package main

import "fmt"

func main() {
    a := []int{1, 2, 3, 4, 5}
    b := a[:2]       // b ссылается на первые два элемента a: [1, 2]
    b = append(b, 100) // добавляем 100 в срез b
    fmt.Println(a, b)
}

Разбор:

  • Изначально a = [1, 2, 3, 4, 5]
  • b := a[:2] — срез b содержит [1, 2], при этом у b емкость равна 5 (от 0 до конца a)
  • append(b, 100) добавляет элемент 100 в срез b. Поскольку емкость b позволяет расшириться без выделения новой памяти, элемент 100 записывается в a[2], то есть изменяет исходный массив a.

После append:

  • a становится [1, 2, 100, 4, 5]
  • b становится [1, 2, 100]

Вывод:

[1 2 100 4 5] [1 2 100]

То есть изменился элемент a[2] из 3 в 100, так как b и a разделяют один underlying array.

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

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

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

Подробнее