2013-09-01 20 views
15

Czy w programie Go istnieje dowolna funkcja kopiowania jednej tablicy na drugą? Czy to działa w przypadku dwóch (lub więcej) tablic wymiarowych?Funkcja kopiowania tablic w języku Go

+0

Pułapka: tablice i plasterki mogą wyglądać bardzo podobnie, zachowanie jest inne. Tablice są według wartości, wycinki według odniesienia (uproszczone). – Christian

Odpowiedz

18

Czy istnieje funkcja wbudowana w języku Go do kopiowania jednej tablicy na drugą?

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

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

copy(a, b) 

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

Czy to zadziała w przypadku dwóch (lub więcej) tablic wymiarowych?

copy zrobi płytką kopię wierszy: 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 

nie sądzę, nie ma wbudowaną za to głęboko copys tablic wielowymiarowych: można to zrobić ręcznie jak: 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: jak wskazano w uwagach, że zakłada się przez „skopiować tablicę” masz na myśli „zrób głęboki kopię wycinka”, jak tablice mogą być głęboko kopiowane z = operatora za odpowiedź jnml jest (bo tablice są typy wartości): http://play.golang.org/p/8EuFqXnqPB

+0

wielkie dzięki. Pomogło to –

+4

Masz odpowiedź na pytanie: "Czy w języku Go jest wbudowana funkcja kopiowania jednego plasterka na inny?" Które może być tym, co OP faktycznie chciał, ale powinieneś wyjaśnić różnicę między tablicami a plasterkami. –

12

Funkcja „” primary do kopiowania tablicę Przejdź jest assignment operator =, jak to jest w przypadku każdej innej wartości innego typu.

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


wyjściowa:

[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 Przypisanie tablicy spowoduje skopiowanie całej tablicy, tak jakby była to struktura. To jest inne niż w C. Aby utworzyć wskaźnik tablicy, musisz jawnie wziąć adres za pomocą "&". – galaktor

+0

@ErikAigner No. Tablice są * nie * wskaźnikiem lub typem odniesienia w Go. – Jeremy

6

Zastosowanie 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] 
Powiązane problemy