Переназначение параметра слайса действует по-другому - PullRequest
0 голосов
/ 01 января 2019
package main

import "fmt"

func main() {
    paths := []string{"hello", "world", "mars"}
    var result = delete(paths, 1)
    fmt.Println(result)
    fmt.Println(paths)
}

func delete(paths []string, index int) []string {
    paths = append(paths[:index], paths[index+1:]...)
    return paths
}

Результат приведенного выше кода следующий:

[hello mars]

[hello mars mars]

Asвы видите, второй fmt.Println(paths), очевидно, использует измененный фрагмент, но не использует переназначенное значение.Это почему?Я ожидал, что он напечатает [hello mars], как и раньше.

Я знаю, что передаваемый paths - это не тот же срез, что и параметр paths в функции delete(), ожидающий ссылки на тот жебазовый массив.Но я все еще не понимаю, как я изменил базовый массив paths, передаваемый в функцию delete, так как он печатает [hello mars mars] вместо [hello world mars].

1 Ответ

0 голосов
/ 01 января 2019

Потому что, как вы сказали, используется один и тот же базовый массив.Когда вы выполняете добавление, paths[:1] - это фрагмент длиной 1 и емкостью 3, а paths[2:] - это фрагмент длиной 1, поэтому в базовом массиве первого фрагмента достаточно места для добавления нового значения без выделенияновый массив.paths в main по-прежнему является фрагментом длины 3, поскольку он никогда не изменялся, но поскольку базовый массив был изменен (в частности, элемент 1), вы видите значение, которое видите.

Возможно, вы захотитевзглянуть на https://blog.golang.org/go-slices-usage-and-internals, если вы еще этого не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...