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" a
với chiều dài 10
. Sau đó, chúng ta tạo x
lát cắt đích bằng cách cắt a
mảng này , y
lát được tạo bằng chữ hỗn hợp []int{3, 4}
. Bây giờ khi chúng tôi thêm y
và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ộ a
cũng đã thay đổi, bởi vì công suất x
là 10
đó là đủ để nối thêm y
vào nó, vì vậy x
được resliced mà cũng sẽ sử dụng cùng một a
mảng ủng hộ, vàappend()
sẽ sao chép các yếu tố y
và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 x
như 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 x
kết quả tương tự nhưng mảng sao lưu a
không thay đổi, vì dung lượng x
là "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 x
và 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.