Avatar
1
Nguyễn Hiếu Beginner
[BadQuestionBecauseCodeInImage]Append slice in Golang

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

  • Answer
question
Remain: 5
3 Answers
Avatar
ducnt114 Beginner
ducnt114 Beginner
Đầ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

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] = 10 hoặc b[1] = 10

và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
  • Reply
anh giải thich lại chỗ mảng a thành 1 2 4 5 6 6 dùm em với và 2 cái hình a[:2] vì sao lại là 2 6 vậy anh  –  Nguyễn Hiếu 1657070562000
a[:2] mà có 2/6 hiểu là len và capacity của a[:2] là 2 và 6 nhé, chứ không phải nó chứa hai phần tử 2 và 6 đâu  –  ducnt114 1657071257000
slice có 3 thứ để định nghĩa nên: pointer trỏ đến vị trí của mảng dữ liệu, len, capacity  –  ducnt114 1657071311000
Avatar
ducnt114 Beginner
ducnt114 Beginner

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
  • Reply
Avatar
daj ok em hiểu rôif aj em cảm ơn
  • 0
  • Reply