```
import "fmt"
func main() {
intSlice := []int{1, 2, 3, 4}
for index, value := range intSlice {
fmt.Println(index, value)
// 情况1
//if value == 2 {
// intSlice = append(intSlice[:index], intSlice[index+1:]...)
//}
// 情况2
//intSlice = []int{}
}
}
```
这个例子很有趣,我没分析出原因。
在情况2的情况下,range循环依然进行了4次,那么也就是说range其实对切片进行了拷贝?那么对于大切片来说,这种弊端岂不是很严重,如果不是拷贝,那么怎么能在切片被修改后,还依然能够遍历4次。
#6
更多评论
熟悉 slice 类型的内存布局就可以解释这两种情况了。slice 是由底层数组指针、len、cap 构成
情况一:
底层数组指针不变,所以append 操作还是原数组地址数据,在append 操作结束后,数组实际存储为 1,3,4,4
情况二:
range 关键字是会进行复制对象的,而 slice 是拷贝传递,所以在 for 中修改 intSlice 并不影响原来的 slice 迭代
#2