Я думаю, что исходный ответ не совсем верный. append()
изменил как срезы, так и базовый массив, хотя базовый массив был изменен, но все еще разделялся обоими срезами.
Как указано в Go Doc:
Срез не хранит каких-либо данных, он просто описывает сечение основного массива.(Link)
Ломтики просто обертка вокруг значения массивов, а это означает, что они содержат информацию о том, как они срез лежащий в основе массива, которые они используют для хранения набора данных. Поэтому по умолчанию срез, передаваемый другому методу, фактически передается по значению вместо указателя/указателя, хотя он все равно будет использовать один и тот же базовый массив. Обычно массивы также передаются по значению, поэтому я предполагаю, что точки среза в базовом массиве вместо сохранения в качестве значения. Что касается вашего вопроса, когда вы бежите сдадите кусочек следующей функции:
func Test(slice []int) {
slice = append(slice, 100)
fmt.Println(slice)
}
вы на самом деле прошли копию ломтика вместе с указателем на тот же основные средств array.That, изменения, которые вы сделали в slice
не влияет на функцию в функции main
. Это сам срез, который хранит информацию о том, какая часть массива она срезает и предоставляет общественности. Поэтому, когда вы запустили append(slice, 1000)
, при расширении базового массива вы также изменили информацию обрезания slice
, которая была сохранена в вашей функции Test()
.
Однако, если вы изменили свой код следующим образом, она могла бы работать:
func main() {
for i := 0; i < 7; i++ {
a[i] = i
}
Test(a)
fmt.Println(a[:cap(a)])
}
Причина заключается в том, что вы расширили a
говоря a[:cap(a)]
над его изменили основной массив, измененный Test()
функции. Как указано здесь:
Вы можете удлинить длину среза, перерезав его, при условии, что он имеет достаточную емкость. (Link)
Спасибо, larsmans, я изменил код. «сделать» даст достаточную мощность. Результат тот же, и я смущен. –
Пробовал в игровой площадке Go. Коды не работали. – Gizak