2013-09-01 45 views
15

Có chức năng tích hợp trong Go để sao chép mảng này sang mảng khác không? Thao tác này có hoạt động trong trường hợp có hai mảng chiều (hoặc nhiều hơn) không?Chức năng sao chép các mảng bằng ngôn ngữ Go

+0

Sự đổ vỡ: mảng và lát có thể trông khá giống nhau, hành vi khác nhau. Mảng là giá trị, lát theo tham chiếu (đơn giản). – Christian

Trả lời

18

Có bất kỳ chức năng tích hợp nào trong ngôn ngữ Go để sao chép mảng này sang mảng khác không?

Có: http://play.golang.org/p/_lYNw9SXN5

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

copy(a, b) 

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

Sẽ làm việc này trong trường hợp hai (hoặc nhiều hơn) mảng chiều?

copy sẽ làm một bản sao cạn của các hàng: 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 

Tôi không nghĩ rằng có một built-in để làm sâu copys của mảng đa chiều: bạn có thể làm điều đó bằng tay như: 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 

chỉnh sửa: như đã chỉ ra trong các ý kiến, tôi cho rằng bằng cách "sao chép một mảng" bạn có nghĩa là "làm một bản sao sâu sắc về một lát", như mảng có thể sâu sao chép với dòng 0.123.điều hành như mỗi câu trả lời jnml của (vì mảng là kiểu giá trị): http://play.golang.org/p/8EuFqXnqPB

+0

cảm ơn rất nhiều. Nó đã giúp –

+4

Bạn đã trả lời câu hỏi: "Có bất kỳ chức năng tích hợp nào trong ngôn ngữ Go để sao chép một lát này sang lát khác không?" Mà có thể là những gì OP thực sự muốn nhưng bạn nên giải thích sự khác biệt giữa mảng và lát. –

12

Các chính "chức năng" để sao chép một mảng ở Gò là assignment operator =, vì nó là trường hợp đối với bất kỳ giá trị khác của bất kỳ loại nào khác.

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


Output:

[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 Chỉ định một mảng sẽ sao chép toàn bộ mảng, như thể nó là một cấu trúc. Điều này khác với C. Để tạo một con trỏ mảng, bạn phải sử dụng địa chỉ '&' một cách rõ ràng. – galaktor

+0

@ErikAigner No. Mảng là * không * con trỏ hoặc loại tham chiếu trong Go. – Jeremy

6

Sử dụng 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:

01.
A: [1 2 3] 
B: [0 0 0] 
A: [1 2 3] 
B2: [1 2 3] 
A: [1 2 3] 
B3: [1 9 3] 
Các vấn đề liên quan