Голанг: как скопировать массив в другой массив

Массив в Go — это набор элементов одного типа фиксированного размера. Элементы массива хранятся последовательно, и к ним можно получить доступ, используя их индекс . Golang не предоставляет специальной встроенной функции для копирования одного массива в другой. Но мы можем создать копию массива, просто назначив массив новой переменной по значению или по ссылке.

Как скопировать массив в другой массив в Golang

Если мы создадим копию массива по значению и внесем некоторые изменения в значения исходного массива, то это не отразится в копии этого массива.

Если мы создадим копию массива по ссылке и внесем некоторые изменения в значения исходного массива, то это отразится в копии этого массива.

//создание копии массива с помощью valuearrByVal: = arr//Создание копии массива  по ссылкеarrByRef: = & arr 

Давайте рассмотрим краткий пример, в котором мы создаем массив, а затем копируем этот массив в другой массив, используя значение и ссылку.

 package mainimport "fmt" func main () {arr: = [4] string {"Италия", "Испания", "Германия", "Франция"}  arrByVal: = arr//данные передаются по valuearrByRef: = & arr//данные передаются по refrencefmt.Printf ("arr:% v  n", arr) fmt.Printf ("arrByVal:% v  n", arrByVal)  fmt.Printf ("* arrByRef:% v  n", * arrByRef) arr [3] = "USA" fmt.Printf ("--- После изменения исходного массива arr ---  n") fmt.Printf (  "arr:% v  n", arr) fmt.Printf ("arrByVal:% v  n", arrByVal) fmt.Printf ("* arrByRef:% v  n", * arrByRef)} 

Выход ut

 arr: [Италия Испания Германия Франция] arrByVal: [Италия Испания Германия Франция] * arrByRef: [Италия Испания Германия Франция] --- После изменения исходного массива arr -  -arr: [Италия Испания Германия США] arrByVal: [Италия Испания Германия Франция] * arrByRef: [Италия Испания Германия США] 

Пояснение

Сначала мы определили массив строк под названием arr, который состоит из четырех строковых элементов.

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

Затем мы создали еще один копия массива из arr по ссылке. Этот вновь созданный скопированный массив называется

Итак, мы создали два скопированных массива из исходного массива.

  1. arrByVal : массив копируется с использованием значения.
  2. arrByRef : массив копируется с использованием ссылки .

На следующем этапе мы изменили исходное значение, заменив Францию ​​на США.

Это означает, что теперь исходный массив изменен.

Теперь посмотрим, какой из скопированных массивов изменился.

Итак, на следующем шаге мы снова напечатали два скопированных массива. 1) arrayByVal 2) arrayByRef

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

Есть ли в Golang встроенная функция для копирования одного массива в другой?

Если вы используете слайс Golang, то есть одна функция с именем copy (), который можно использовать для копирования одного массива в другой.

См. следующий код.

 package mainimport "  fmt "func main () {arr: = [] string {" Italy "," Spain "} arrSource: = [] string {" Germany "," France "} copy (arr, arrSource)//данные передаются по значению fmt  .Printf ("Исходный массив:% v  n", arrSource) fmt.Printf ("Скопированный массив:% v  n", arr)} 

Вывод

 go run hello.goOrignal Array: [Германия Франция] Скопированный массив: [Германия Франция] 

Функция copy () выполнит неглубокую копию, а не глубокая копия. Нет встроенной функции для выполнения глубокого копирования многомерных массивов.

Заключение

Первый подход для копирования массива в Go — это оператор присваивания =, как и для любого другого значения любого другого типа.

Если вы используете фактический массив (а не что-то, созданное с помощью make (), тогда присваивание работает отлично.

Однако, если вы имеете дело с срезами (что, как я вижу, некоторых смутила бы разница), вам нужно явно использовать функцию copy (), иначе у вас будет ссылочный тип с указателями, вызывающими проблемы.

Наконец, наш массив копий в примере с Golang завершен.

Оцените статью
nanomode.ru
Добавить комментарий