web-dev-qa-db-fra.com

Fonction de copie de tableaux en langue Go

Existe-t-il une fonction intégrée dans Go pour copier un tableau dans un autre? Est-ce que cela fonctionnera dans le cas de tableaux bidimensionnels (ou plus)?

18
angry_gopher

Existe-t-il une fonction intégrée en langage Go pour copier un tableau dans un autre?

Oui: http://play.golang.org/p/_lYNw9SXN5

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

copy(a, b)

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

Est-ce que cela fonctionnera dans le cas de tableaux bidimensionnels (ou plus)?

copy fera une copie superficielle des lignes: 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's second row is different; a still looks the same

b[0][0] = "Apple"

// now a looks different

Je ne pense pas qu'il y ait une fonction intégrée pour faire des copies en profondeur de tableaux multidimensionnels: vous pouvez le faire manuellement comme: http://play.golang.org/p/nlVJq-ehzC

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: Comme indiqué dans les commentaires, j'ai supposé par "copier un tableau" que vous vouliez dire "faire une copie complète d'une tranche", car les tableaux peuvent être copiés en profondeur avec le = opérateur selon la réponse de jnml (car les tableaux sont des types de valeur): http://play.golang.org/p/8EuFqXnqPB

25
Alec

La "fonction" principale pour copier un tableau dans Go est opérateur d'affectation = , comme c'est le cas pour toute autre valeur de tout autre type.

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)
}

Aire de jeux


Production:

[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]]
15
zzzz

Utilisez copyhttp://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)

EN DEHORS:

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