2013-09-01 11 views
15

Gibt es in Go eine integrierte Funktion zum Kopieren eines Arrays in ein anderes? Funktioniert das bei zwei (oder mehr) dimensionalen Arrays?Funktion zum Kopieren von Arrays in Go-Sprache

+0

Fallstricke: Arrays und Slices können sehr ähnlich aussehen, das Verhalten ist anders. Arrays sind nach Wert, Scheiben nach Referenz (vereinfacht). – Christian

Antwort

18

Gibt es in der Go-Sprache eine eingebaute Funktion zum Kopieren eines Arrays in ein anderes?

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

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

copy(a, b) 

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

Wird diese Arbeit im Fall von zwei (oder mehr) dimensionale Arrays?

copy wird eine flache Kopie der Zeilen tun: 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 

Das glaube ich nicht, dass es eine eingebaute in dafür tief copys von mehrdimensionalen Arrays: Sie können es tun manuell wie: 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: wie in den Kommentaren darauf hingewiesen, nahm ich durch „einen Array kopieren“ Sie bedeuten „eine tiefe Kopie einer Scheibe tun“, wie Arrays kann mit den 0.123.665 tief kopiert werdenOperator gemäß jnml Antwort (weil Arrays sind Werttypen): http://play.golang.org/p/8EuFqXnqPB

+0

vielen Dank. Es half –

+4

Sie haben die Frage beantwortet: "Gibt es eine eingebaute Funktion in Go-Sprache für das Kopieren einer Scheibe in eine andere?" Was vielleicht das war, was das OP eigentlich wollte, aber Sie sollten den Unterschied zwischen Arrays und Slices erklären. –

12

Die primäre „Funktion“ für das Kopieren eines Arrays in Go ist der assignment operator =, wie es der Fall für einen anderen Wert von einer anderen Art ist.

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


Ausgang:

[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 Beim Zuweisen eines Arrays wird das gesamte Array kopiert, als wäre es eine Struktur. Dies ist anders als in C. Um einen Array-Zeiger zu erstellen, müssen Sie die Adresse explizit mit '&' übernehmen. – galaktor

+0

@ErikAigner Nein. Arrays sind * nicht * ein Zeiger oder ein Referenztyp in Go. – Jeremy

6

Verwenden 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] 
Verwandte Themen