Подтвердить что ты не робот

Функция для копирования массивов в языке Go

Есть ли встроенная функция в Go для копирования одного массива в другой? Будет ли это работать в случае двух (или более) размерных массивов?

4b9b3361

Ответ 1

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

Да: http://play.golang.org/p/_lYNw9SXN5

a := []string{
    "hello",
    "world",
}
b := []string{
    "goodbye",
    "world",
}

copy(a, b)

// a == []string{"goodbye", "world"}

Будет ли это работать в случае двух (или более) размерных массивов?

copy сделает мелкую копию строк: http://play.golang.org/p/0gPk6P1VWh

a := make([][]string, 10)

b := make([][]string, 10)
for i := range b {
    b[i] = make([]string, 10)
    for j := range b[i] {
        b[i][j] = strconv.Itoa(i + j)
    }
}

copy(a, b)

// a and b look the same

b[1] = []string{"some", "new", "data"}

// b second row is different; a still looks the same

b[0][0] = "apple"

// now a looks different

Я не думаю, что есть встроенный инструмент для создания глубоких копий многомерных массивов: вы можете сделать это вручную: http://play.golang.org/p/nlVJq-ehzC p >

a := make([][]string, 10)

b := make([][]string, 10)
for i := range b {
    b[i] = make([]string, 10)
    for j := range b[i] {
        b[i][j] = strconv.Itoa(i + j)
    }
}

// manual deep copy
for i := range b {
    a[i] = make([]string, len(b[i]))
    copy(a[i], b[i])
}

b[0][0] = "apple"

// a still looks the same

edit: Как указано в комментариях, я предположил, что "копировать массив" означает "сделать глубокую копию среза", поскольку массивы могут быть глубоко скопированы с помощью оператора = в соответствии с ответом jnml ( потому что массивы являются типами значений): http://play.golang.org/p/8EuFqXnqPB

Ответ 2

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

package main

import "fmt"

func main() {
        var a, b [4]int
        a[2] = 42
        b = a
        fmt.Println(a, b)

        // 2D array
        var c, d [3][5]int
        c[1][2] = 314
        d = c
        fmt.Println(c)
        fmt.Println(d)
}

Игровая площадка


Вывод:

[0 0 42 0] [0 0 42 0]
[[0 0 0 0 0] [0 0 314 0 0] [0 0 0 0 0]]
[[0 0 0 0 0] [0 0 314 0 0] [0 0 0 0 0]]

Ответ 3

Используйте copy http://play.golang.org/p/t7P6IliMOK

a := []int{1, 2, 3}
var b [3]int

fmt.Println("A:", a)
fmt.Println("B:", b)

copy(b[:], a)

fmt.Println("A:", a)
fmt.Println("B2:", b)

b[1] = 9

fmt.Println("A:", a)
fmt.Println("B3:", b)

OUT:

A: [1 2 3]
B: [0 0 0]
A: [1 2 3]
B2: [1 2 3]
A: [1 2 3]
B3: [1 9 3]