package main

В текущей реализации функция ap не изменяет исходный слайс v, потому что операция append может создать новый слайс, а присвоение arr = append(arr, 10) меняет только локальную копию arr.

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

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

В текущей реализации функция ap не изменяет исходный слайс v, потому что операция append может создать новый слайс, а присвоение arr = append(arr, 10) меняет только локальную копию arr.

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

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

Условие

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 }

Ответ

В текущей реализации функция ap не изменяет исходный слайс v, потому что операция append может создать новый слайс, а присвоение arr = append(arr, 10) меняет только локальную копию arr.

Чтобы добавить элемент и отсортировать слайс без возвращения значения, нужно модифицировать слайс по ссылке и использовать сортировку из пакета sort:

package main

import (
	"fmt"
	"sort"
)

func main() {
	v := []int{3, 4, 1, 2, 5}
	ap(v)
	fmt.Println(v) // результат работы должен быть - [1 2 3 4 5 6]
}

func ap(arr []int) {
	arr = append(arr, 6) // добавляем 6
	sort.Ints(arr)       // сортируем слайс
	// arr теперь содержит [1 2 3 4 5 6]
}

Однако, поскольку append может вернуть новый слайс с другим указателем, изменения не отразятся на исходном v в main. Чтобы это исправить, нужно передавать указатель на слайс:

func ap(arr *[]int) {
	*arr = append(*arr, 6)
	sort.Ints(*arr)
}

func main() {
	v := []int{3, 4, 1, 2, 5}
	ap(&v)
	fmt.Println(v) // [1 2 3 4 5 6]
}

Таким образом, функция ap не возвращает значение, но изменяет слайс по указателю, добавляя 6 и сортируя его.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку