1. 程式人生 > 實用技巧 >go for迴圈陷阱(類似c++的迭代器失效)

go for迴圈陷阱(類似c++的迭代器失效)

  迭代器自身是不知道是否“失效”的,它本質上只是一個迭代物件的包裝。

  我對“失效”的理解是,在建立一次迭代的開始時,這個迭代器應該迭代的所有元素就已經確定了,換句話說,有一個確定的迭代序列;如果說在迭代的過程中出現了與已經確定的迭代序列不同的序列,那麼就可能會認為這個迭代器失效了。

  具體到不同的容器,迭代器失效的情況也是不一樣的,會存在一些只會使指向容器中某個特定元素失效的情況,也有可能使指向所有元素的迭代器都失效。

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) }