<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      為什么 Go for-range 的 value 值地址每次都一樣?

      原文鏈接: 為什么 Go for-range 的 value 值地址每次都一樣?

      循環(huán)語句是一種常用的控制結(jié)構(gòu),在 Go 語言中,除了 for 關(guān)鍵字以外,還有一個 range 關(guān)鍵字,可以使用 for-range 循環(huán)迭代數(shù)組、切片、字符串、map 和 channel 這些數(shù)據(jù)類型。

      但是在使用 for-range 循環(huán)迭代數(shù)組和切片的時候,是很容易出錯的,甚至很多老司機(jī)一不小心都會在這里翻車。

      具體是怎么翻的呢?我們接著看。

      現(xiàn)象

      先來看兩段很有意思的代碼:

      無限循環(huán)

      如果我們在遍歷數(shù)組的同時向數(shù)組中添加元素,能否得到一個永遠(yuǎn)都不會停止的循環(huán)呢?

      比如下面這段代碼:

      func main() {
          arr := []int{1, 2, 3}
          for _, v := range arr {
              arr = append(arr, v)
          }
          fmt.Println(arr)
      }
      

      程序輸出:

      $ go run main.go
      1 2 3 1 2 3
      

      上述代碼的輸出意味著循環(huán)只遍歷了原始切片中的三個元素,我們在遍歷切片時追加的元素并沒有增加循環(huán)的執(zhí)行次數(shù),所以循環(huán)最終還是停了下來。

      相同地址

      第二個例子是使用 Go 語言經(jīng)常會犯的一個錯誤。

      當(dāng)我們在遍歷一個數(shù)組時,如果獲取 range 返回變量的地址并保存到另一個數(shù)組或者哈希時,會遇到令人困惑的現(xiàn)象:

      func main() {
          arr := []int{1, 2, 3}
          newArr := []*int{}
          for _, v := range arr {
              newArr = append(newArr, &v)
          }
          for _, v := range newArr {
              fmt.Println(*v)
          }
      }
      

      程序輸出:

      $ go run main.go
      3 3 3
      

      上述代碼并沒有輸出 1 2 3,而是輸出 3 3 3

      正確的做法應(yīng)該是使用 &arr[i] 替代 &v,像這種編程中的細(xì)節(jié)是很容易出錯的。

      原因

      具體原因也并不復(fù)雜,一句話就能解釋。

      對于數(shù)組、切片或字符串,每次迭代,for-range 語句都會將原始值的副本傳遞給迭代變量,而非原始值本身。

      口說無憑,具體是不是這樣,還得靠源碼說話。

      Go 編譯器會將 for-range 語句轉(zhuǎn)換成類似 C 語言的三段式循環(huán)結(jié)構(gòu),就像這樣:

      // Arrange to do a loop appropriate for the type.  We will produce
      //   for INIT ; COND ; POST {
      //           ITER_INIT
      //           INDEX = INDEX_TEMP
      //           VALUE = VALUE_TEMP // If there is a value
      //           original statements
      //   }
      

      迭代數(shù)組時,是這樣:

      // The loop we generate:
      //   len_temp := len(range)
      //   range_temp := range
      //   for index_temp = 0; index_temp < len_temp; index_temp++ {
      //           value_temp = range_temp[index_temp]
      //           index = index_temp
      //           value = value_temp
      //           original body
      //   }
      

      切片

      //   for_temp := range
      //   len_temp := len(for_temp)
      //   for index_temp = 0; index_temp < len_temp; index_temp++ {
      //           value_temp = for_temp[index_temp]
      //           index = index_temp
      //           value = value_temp
      //           original body
      //   }
      

      從上面的代碼片段,可以總結(jié)兩點(diǎn):

      1. 在循環(huán)開始前,會將數(shù)組或切片賦值給一個新變量,在賦值過程中就發(fā)生了拷貝,迭代的實際上是副本,這也就解釋了現(xiàn)象 1。
      2. 在循環(huán)過程中,會將迭代元素賦值給一個臨時變量,這又發(fā)生了拷貝。如果取地址的話,每次都是一樣的,都是臨時變量的地址。

      以上就是本文的全部內(nèi)容,如果覺得還不錯的話歡迎點(diǎn)贊轉(zhuǎn)發(fā)關(guān)注,感謝支持。


      參考文章:

      推薦閱讀:

      posted @ 2023-04-30 15:08  yongxinz  閱讀(186)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 男女xx00xx的视频免费观看| 亚洲第一福利网站在线观看| 国产一区二区在线影院| 真实国产乱啪福利露脸| 人妻少妇精品系列一区二区| 不卡一区二区国产精品| 美女无遮挡免费视频网站| 农村老熟女一区二区三区| 国产在线观看免费观看不卡| 国产精品自拍视频第一页| 国产av中文字幕精品| 亚洲午夜爱爱香蕉片| 三级黄色片一区二区三区| 欧美日韩国产图片区一区| 国产女人叫床高潮大片| 男女激情一区二区三区| a级黑人大硬长爽猛出猛进| 久热这里有精品免费视频| 伊人久久精品无码二区麻豆| 成人一区二区三区久久精品| 日本久久久免费高清| 国产极品美女高潮无套| 亚洲一区二区三成人精品| 伊人久久久大香线蕉综合直播| 国产精品不卡一区二区三区| 免费福利视频一区二区三区高清| 国内精品免费久久久久电影院97| 免费无码AV一区二区波多野结衣| 2021亚洲国产精品无码| 韩国美女福利视频在线观看| 99er热精品视频| 亚洲色偷偷偷网站色偷一区| 99RE8这里有精品热视频| 万年县| 福利一区二区不卡国产| 国产精品成人高潮av| 日韩有码中文字幕国产| 国产精品一久久香蕉国产线看观看| 国产91精品一区二区亚洲| 亚洲精品成人福利网站| 色窝窝免费播放视频在线|