go for迴圈陷阱(類似c++的迭代器失效)
阿新 • • 發佈:2020-11-23
迭代器自身是不知道是否“失效”的,它本質上只是一個迭代物件的包裝。
我對“失效”的理解是,在建立一次迭代的開始時,這個迭代器應該迭代的所有元素就已經確定了,換句話說,有一個確定的迭代序列;如果說在迭代的過程中出現了與已經確定的迭代序列不同的序列,那麼就可能會認為這個迭代器失效了。
具體到不同的容器,迭代器失效的情況也是不一樣的,會存在一些只會使指向容器中某個特定元素失效的情況,也有可能使指向所有元素的迭代器都失效。
func main() { // 錯誤例子: slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} for i, value := range slice {if value%3 == 0 { // remove 3, 6, 9 fmt.Println(i, value, len(slice)) slice = append(slice[:i], slice[i+1:]...) // 刪除後,slice會立即變,記憶體都可能改變了,但是i依然是舊的,所以會造成越界 } } fmt.Printf("%vn", slice) //// 解決辦法: 把需要保留的放到最左邊,最後擷取切片就ok了 //slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}//k := 0 //for _, v := range slice { // if v%3 != 0 { // slice[k] = v // k++ // } //} //slice = slice[:k] //fmt.Println(slice) }