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
Trả lời
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
cảm ơn rất nhiều. Nó đã giúp –
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. –
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)
}
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]]
Sử dụng copy
http://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]
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