2013-09-01 26 views
15

Esiste una funzione incorporata in Go per la copia di un array in un altro? Funzionerà in caso di due (o più) array dimensionali?Funzione per la copia di matrici nella lingua Go

+0

Pitfall: array e fette possono sembrare molto simili, il comportamento è diverso. Le matrici sono per valore, fette per riferimento (semplificato). – Christian

risposta

18

Esiste una funzione incorporata nella lingua Go per copiare un array in un altro?

Sì: http://play.golang.org/p/_lYNw9SXN5

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

copy(a, b) 

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

Sarà questo lavoro in caso di due (o più) matrici tridimensionali?

copy farà una copia delle righe: 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 

Io non credo che ci sia un built-in per fare deep-copys di array multidimensionali: è possibile farlo manualmente come: 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: come sottolineato nei commenti, ho assunto da "copiare una matrice" si intende "fare una copia completa di una fetta", come array possono essere profondamente copiati con il 0.123.operatore secondo la risposta di jnml (perché gli array sono tipi di valore): http://play.golang.org/p/8EuFqXnqPB

+0

grazie mille. Mi ha aiutato –

+4

hai risposto alla domanda: "C'è qualche funzione built-in linguaggio Go per la copia di una fetta ad un altro" Quale potrebbe essere ciò che l'OP voleva realmente, ma dovresti spiegare la differenza tra array e slice. –

12

La "funzione" primaria per la copia di un array in Go è il assignment operator =, come è il caso per qualsiasi altro valore di qualsiasi altro tipo.

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

Playground


uscita:

[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]] 
+4

@ErikAigner Assegnazione di un array copierà l'intero array, come se fosse uno struct. Questo è diverso da quello in C. Per creare un puntatore è necessario prendere in modo esplicito l'indirizzo utilizzando '&'. – galaktor

+0

@ErikAigner No. Le matrici sono * non * un puntatore o un tipo di riferimento in Go. – Jeremy

6

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

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] 
Problemi correlati