2017-01-27 15 views
0

Для ниже массиваGO - Является ли массив копией глубокой или мелкой копии?

var a[2][3]int 
a[0][0] = 55 
a[0][1] = 56 
a[0][2] = 57 
a[1][0] = 65 
a[1][1] = 66 
a[1][2] = 67 

на выполнение копию массива,

a[0] = a[1] 

Вопрос:

ли массив (a[0]) скопировать глубокую копию или неполную копию?

После копирования, есть ли a[0] отдельные значения (3 int iS), чем a[1] значений (3 int 'ы)?

ответ

4

Это глубокая копия. Массив в Go не включает никаких указателей (если, конечно, это не массив указателей). Каждая переменная типа массива имеет свой собственный непрерывный блок памяти, содержащий его значения.

После кода инициализации a представляет собой блок памяти, как это (только 6 int s в 6 последовательных слов памяти):

55 56 57 65 66 67 

Затем после копирования, это выглядит так:

65 66 67 65 66 67 

Имеются две отдельные копии значений.

(Но ломтики разные. У них есть указатели, и поэтому они обычно копируются неглубоко.)

+0

Я хорош в C, но это понятие указателя существует в GO? – overexchange

+1

@overexchange: Начните с основной [документации для Go] (https://golang.org/ref/spec). Указатели имеют основополагающее значение для языка, и вы не можете использовать его без них. – JimB

+0

Go имеет типы указателей (как в 'var p * int'), но в этом случае я говорю о неявном указателе, который является частью заголовка среза. – andybalholm