В текущей реализации функция ap не изменяет исходный слайс v, потому что операция append может создать новый слайс, а присвоение arr = append(arr, 10) меняет только локальную копию arr.
package main
В текущей реализации функция 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 и сортируя его.