Tôi nghĩ điều quan trọng là phải chỉ ra và phải biết rằng nếu lát đích (lát cắt mà bạn nối thêm) có đủ năng lực, thì phần bổ sung sẽ xảy ra "tại chỗ", bằng cách nối lại đích (thay đổi để tăng độ dài của nó có thể chứa các yếu tố nối thêm).
Điều này có nghĩa là nếu đích được tạo bằng cách cắt một mảng hoặc lát lớn hơn có các phần tử bổ sung vượt quá độ dài của lát kết quả, chúng có thể bị ghi đè.
Để chứng minh, xem ví dụ này:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Đầu ra (thử trên Sân chơi Go ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
Chúng tôi tạo ra một mảng "sao lưu" avới chiều dài 10. Sau đó, chúng ta tạo xlát cắt đích bằng cách cắt amảng này , ylát được tạo bằng chữ hỗn hợp []int{3, 4}. Bây giờ khi chúng tôi thêm yvào x, kết quả là dự kiến [1 2 3 4], nhưng những gì có thể được ngạc nhiên là các mảng ủng hộ acũng đã thay đổi, bởi vì công suất xlà 10đó là đủ để nối thêm yvào nó, vì vậy xđược resliced mà cũng sẽ sử dụng cùng một amảng ủng hộ, vàappend() sẽ sao chép các yếu tố yvào đó.
Nếu bạn muốn tránh điều này, bạn có thể sử dụng biểu thức lát đầy đủ có dạng
a[low : high : max]
mà xây dựng một lát và cũng kiểm soát dung lượng của lát cắt kết quả bằng cách đặt nó thành max - low.
Xem ví dụ đã sửa đổi (sự khác biệt duy nhất là chúng tôi tạo xnhư thế này x = a[:2:2]::
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Đầu ra (thử trên Sân chơi Go )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
Như bạn có thể thấy, chúng tôi nhận được xkết quả tương tự nhưng mảng sao lưu akhông thay đổi, vì dung lượng xlà "chỉ" 2(nhờ biểu thức lát đầy đủ a[:2:2]). Vì vậy, để thực hiện nối thêm, một mảng sao lưu mới được phân bổ có thể lưu trữ các phần tử của cả hai xvà y, khác vớia .
append()một hàm matrixdic và...cho phép bạn truyền nhiều đối số cho một hàm matrixdic từ một lát cắt.