Why Does This Slice Change Its Capacity in Go?
In the "A Tour of Go" slide mentioned, the snippet contains operations on a slice of integers. While the length of the slice is consistently changing, the capacity appears to decrease in the last line. This behavior raises questions about slice capacity's mutability.
Capacity Change from 6 to 4
The capacity of a slice represents the number of slots it can hold. Initially, the slice has a capacity of 6. As data is dropped from the end of the slice (s = s[2:]), the capacity remains unchanged because the distance between the starting index and the backing array's end does not change.
However, when the slice's starting index is moved forward by dropping its first two values (s = s[2:]), the distance between the starting index and the end of the backing array decreases, resulting in a reduced capacity of 4. This is because the slice now occupies a smaller portion of the array.
Why Only the Last Line Changes Its Capacity
The capacity only changes when the slice's starting index is modified. The other operations, such as slicing the slice to zero length or extending its length, do not affect the capacity as they do not alter the starting index.
Slice Header
For a deeper understanding, you can print the slice's header using reflection, which shows the changes in its data pointer. The header's Data field indicates the starting index of the slice within the backing array, while Cap represents the capacity.
In the last call, the Data field is shifted forward, reducing the capacity as the distance between the starting index and the end of the backing array is decreased.
The above is the detailed content of Why Does Slicing a Slice in Go Sometimes Change Its Capacity?. For more information, please follow other related articles on the PHP Chinese website!