[BadQuestionBecauseCodeInImage]Append slice in Golang
<img class="alignnone wp-image-6320" src="https://stackask.com/wp-content/uploads/2022/07/Screenshot-from-2022-07-06-14-06-08.png" alt="" />
Cho em hỏi, vì sao append(a[:2], a[3:]...) mà giá trị trong slice a sau khi thực hiện câu lệnh này nó thay đổi vậy ạ. Em cảm ơn
question
Remain: 5
3 Answers
ducnt114
Pundit
ducnt114
Pundit
Đầu tiên thì e cần hình dùng slice giống như 1 biến có 3 giá trị: con trỏ đến mảng giá trị được cấp phát bộ nhớ, len và capacity
- len là số phần tử mà slice trỏ đến
- capacity là số phần tử tối đa trong mảng giá trị gốc được cấp phát
lệnh b:= append(a[:2], a[3:]...) sẽ thực hiện như hình dưới
<img class="content-img" src="https://stackask.com/wp-content/uploads/2022/07/Screenshot-from-2022-07-06-14-46-14.png" />
lệnh append sẽ lấy 3 phần tử 4,5,6 thay vào 3 vị trí kế tiếp của a[:2] trong array gốc là a, nên sau lệnh đó thì a sẽ có các phần tử lần lượt là 1,2,4,5,6,6
b sẽ là slice có
- len = len(a[:2]) + len(a[3:]) = 5
- cap = max(cap(a[:2]), len(a[:2]) + len(a[3:])) = 6 (khi append mà mảng gốc không đủ chứa các phần tử thì sẽ cấp phát mảng mới để chứa cho đủ)
và b vẫn trỏ đến đầu slice gốc là a. Em có thể thêm 1 lệnh
a[1] = 10b[1] = 10vào cuối để thấy rằng khi thay đổi a hoặc b thì sẽ đổi giá trị ở mảng gốc => cả a và b đều bị ảnh hưởng
nhưng nhớ rằng length của slice a là 6, còn b chỉ là 5, nên nếu thử b[5]=10 sẽ báo lỗi index out of range.
-
0
ducnt114
Pundit
ducnt114
Pundit
<img class="content-img" src="https://stackask.com/wp-content/uploads/2022/07/Screenshot-from-2022-07-06-15-27-01.png" />
append sẽ thay 3 giá trị 4/5/6 vào 3 vị trí a[2], a[3], a[4]
a[:2] hiểu là 2 phần tử đầu tiên của mảng a => len sẽ là 2
a[:2] vẫn refer đến mảng gốc a, capacity sẽ tính từ vị trí mà nó đến (là vị trí a[0]) đến vị trí cuối cùng của mảng a (là a[5]) nên capacity là 6
a[3:] trỏ đến vị trí a[3], cap tính từ a[3] đến cuối của a (a[5]) nên cap là 3
-
0
Nguyễn Hiếu
Beginner