亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang遍歷時修改被遍歷對象的示例詳解

 更新時間:2021年01月15日 14:15:27   作者:janbar  
這篇文章主要介紹了golang遍歷時修改被遍歷對象的示例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

很多時候需要將遍歷對象中去掉某些元素,或者往遍歷對象中添加元素,這時候就需要小心操作了。
對于go語言中的一些注意事項我做了總結(jié)和示例,留下點筆記。

遍歷切片

1.遍歷切片時去掉元素,錯誤示例:

func main() {
  arr := []int{1, 2, 3, 4}
  for i := range arr {
    if arr[i] == 3 {
      arr = append(arr[:i], arr[i+1:]...)
    }
  }
  fmt.Println(arr)
}

最終報錯panic: runtime error: index out of range [3] with length 3,因為range在迭代時已經(jīng)確定i的范圍為[0,len(arr))的左閉右開的區(qū)間。
但是當(dāng)滿足arr[i] == 3時對arr進行了修改,縮短了arr的長度,此時len(arr)=3,最大下標為2,因此當(dāng)執(zhí)行arr[3]時會報錯。

2.遍歷切片時去掉元素,不會報錯,但不建議的寫法:

func main() {
  arr := []int{1, 2, 3, 4}
  for i, v := range arr {
    fmt.Println(i, v)
    if v == 3 {
      arr = append(arr[:i], arr[i+1:]...)
      // arr = []int{4, 5, 6, 7} // 可以將上一行代碼替換,看最終遍歷的i,v情況
    }
  }
  fmt.Println(arr)
}

還是回到range的用法,當(dāng)執(zhí)行for循環(huán)時就已經(jīng)確定(i,v)的遍歷元素值,及時循環(huán)過程中修改arr,也不會改變for要遍歷的(i,v)值。
可以將上面代碼修改一下,看下在循環(huán)中改變arr值時,后面遍歷的(i,v)是不會隨著arr的改變而改變的。

3.遍歷切片時去掉元素,建議寫法:

func main() {
  arr := []int{1, 2, 3, 4}
  for i := 0; i < len(arr); i++ {
    fmt.Println(i, arr[i])
    if arr[i] == 3 {
      arr = append(arr[:i], arr[i+1:]...)
      i--
    }
  }
  fmt.Println(arr)
}

該方案只修改i的值,在刪除元素時進行i--,可以確保遍歷arr沒有問題,而且每次通過arr[i]獲取切片值不存在問題。
當(dāng)然用該方式也可以在遍歷時添加元素,只要i也對應(yīng)變化就沒問題。

遍歷map

1.遍歷map時去掉元素,可參考官方示例,可看下官方描述,下面這種方案是安全的。

for key := range m {
  if key.expired() {
    delete(m, key)
  }
}

2.清空map所有元素,如下第一種是省事的寫法,第二種不會產(chǎn)生新的對象,用哪種看個人喜好吧。

m = make(map[int]int) // 可以產(chǎn)生一個新對象,舊對象等著被垃圾回收
 
for k := range m {
  delete(m,k) // 循環(huán)遍歷并刪除map所有元素,好處是map緩存還在,下次添加時可直接使用緩存
}

總結(jié)

關(guān)于切片遍歷時進行操作需要注意一些坑。
關(guān)于map遍歷時進行操作相對坑少點,不過遍歷map需要修改元素時,map的value要為指針類型,這點得謹記。

到此這篇關(guān)于golang遍歷時修改被遍歷對象的文章就介紹到這了,更多相關(guān)golang遍歷對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言編譯原理之變量捕獲

    Go語言編譯原理之變量捕獲

    這篇文章主要為大家介紹了Go語言編譯原理之變量捕獲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • GO語言類型轉(zhuǎn)換和類型斷言實例分析

    GO語言類型轉(zhuǎn)換和類型斷言實例分析

    這篇文章主要介紹了GO語言類型轉(zhuǎn)換和類型斷言,以實例形式詳細分析了類型轉(zhuǎn)換和類型斷言的概念與使用技巧,需要的朋友可以參考下
    2015-01-01
  • Golang優(yōu)雅關(guān)閉channel的方法示例

    Golang優(yōu)雅關(guān)閉channel的方法示例

    Goroutine和channel是Go在“并發(fā)”方面兩個核心feature,下面這篇文章主要給大家介紹了關(guān)于Golang如何優(yōu)雅關(guān)閉channel的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考解決,下面來一起看看吧。
    2017-11-11
  • Go語言讀取文本文件的三種方式總結(jié)

    Go語言讀取文本文件的三種方式總結(jié)

    工作中時不時需要讀取文本,文本文件是最常見的文件類型。本文將利用Go語言從逐行、逐個單詞和逐個字符三個方法讀取文件,感興趣的可以了解一下
    2023-01-01
  • Golang中這些channel用法你了解嗎

    Golang中這些channel用法你了解嗎

    channel?是GO語言中一種特殊的類型,是連接并發(fā)goroutine的管道,這篇文章主要來和大家分享一下關(guān)于?nil?channel?通道,有緩沖通道,無緩沖通道的常用方法以及巧妙使用的方式,希望對大家有所幫助
    2023-08-08
  • 深入理解Go語言中的結(jié)構(gòu)體

    深入理解Go語言中的結(jié)構(gòu)體

    本文主要介紹了深入理解Go語言中的結(jié)構(gòu)體,包括定義結(jié)構(gòu)體、聲明結(jié)構(gòu)體變量、使用結(jié)構(gòu)體、結(jié)構(gòu)體關(guān)聯(lián)函數(shù)、new、組合等,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 利用go語言實現(xiàn)查找二叉樹中的最大寬度

    利用go語言實現(xiàn)查找二叉樹中的最大寬度

    這篇文章主要介紹了利用go語言實現(xiàn)查找二叉樹中的最大寬度,文章圍繞主題展開詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 詳解Golang中errors包如何返回自定義error類型

    詳解Golang中errors包如何返回自定義error類型

    這篇文章主要為大家詳細介紹了Golang中errors包如何返回自定義error類型,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • 深入了解Golang?interface{}的底層原理實現(xiàn)

    深入了解Golang?interface{}的底層原理實現(xiàn)

    在?Go?語言沒有泛型之前,接口可以作為一種替代實現(xiàn),也就是萬物皆為的?interface。那到底?interface?是怎么設(shè)計的底層結(jié)構(gòu)呢?下面咱們透過底層分別看一下這兩種類型的接口原理。感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-10-10
  • Go中defer使用場景及注意事項

    Go中defer使用場景及注意事項

    defer 會在當(dāng)前函數(shù)返回前執(zhí)行傳入的函數(shù),它會經(jīng)常被用于關(guān)閉文件描述符、關(guān)閉數(shù)據(jù)庫連接以及解鎖資源。這篇文章主要介紹了Go中defer使用注意事項,需要的朋友可以參考下
    2021-12-12

最新評論