亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

淺析Go語言中的Range關鍵字

2020-04-01 19:08:27
字體:
來源:轉載
供稿:網友

前言

相信用過Range的朋友們都知道,Go語言中的range關鍵字使用起來非常的方便,它允許你遍歷某個slice或者map,并通過兩個參數(indexvalue),分別獲取到slice或者map中某個元素所在的index以及其值。

比如像這樣的用法:

for index, value := range mySlice { fmt.Println("index: " + index) fmt.Println("value: " + value)}

上面的例子足夠清晰的描述了range的用法,實際上在使用range關鍵字的時候,還有一些需要特別注意的地方,有一些新手很容易入的”坑”。

為了說明這些”坑”,我們可以從下面這個稍復雜的例子說起:

type Foo struct { bar string}func main() { list := []Foo{ {"A"}, {"B"}, {"C"}, } list2 := make([]*Foo, len(list)) for i, value := range list { list2[i] = &value } fmt.Println(list[0], list[1], list[2]) fmt.Println(list2[0], list2[1], list2[2])}

在這個例子中,我們干了下面的一些事情:

     1、定義了一個叫做Foo的結構,里面有一個叫bar的field。隨后,我們創建了一個基于Foo結構體的slice,名字叫list

     2、我們還創建了一個基于Foo結構體指針類型的slice,叫做list2

     3、在一個for循環中,我們試圖遍歷list中的每一個元素,獲取其指針地址,并賦值到list2中index與之對應的位置。

     4、最后,分別輸出list與list2中的每個元素

從代碼來看,理所當然,我們期望得到的結果應該是這樣:

{A} {B} {C}&{A} &{B} &{C}

但是結果卻出乎意料,程序的輸出是這樣的:

{A} {B} {C}&{C} &{C} &{C}

從結果來看,仿佛list2中的三個元素,都指向了list中的最后一個元素。這是為什么呢?問題就出在上面那一段for…range循環中。

在Go的for…range循環中,Go始終使用值拷貝的方式代替被遍歷的元素本身,簡單來說,就是for…range中那個value,是一個值拷貝,而不是元素本身。這樣一來,當我們期望用&獲取元素的指針地址時,實際上只是取到了value這個臨時變量的指針地址,而非list中真正被遍歷到的某個元素的指針地址。而在整個for…range循環中,value這個臨時變量會被重復使用,所以,在上面的例子中,list2被填充了三個相同的指針地址,并且這三個地址都指向value,而在最后一次循環中,value被賦與了{c}的指針地址。因此,list2輸出的時候顯示出了三個&{c}

同樣的,下面的寫法,跟for…range的例子如出一轍:

var value Foofor var i := 0; i < len(list); i++ { value = list[i] list2[i] = &value}

如果我們輸出list2的三個元素,結果同樣是: &{C} &{C} &{C}

那么,怎樣才是正確的寫法呢?我們應該用index來訪問for…range中真實的元素,并獲取其指針地址:

for i, _ := range list { list2[i] = &list[i]}

這樣,輸出list2中的元素,就能得到我們想要的結果(&{A} &{B} &{C})了。

實驗代碼如下:

package mainimport "fmt"type Foo struct { bar string}func main() { list := []Foo{ {"A"}, {"B"}, {"C"}, } list2 := make([]*Foo, len(list)) //錯誤的例子 for i, value := range list { list2[i] = &value } //正確的例子 //for i, _ := range list { // list2[i] = &list[i] //} fmt.Println(list[0], list[1], list[2]) fmt.Println(list2[0], list2[1], list2[2])}

了解了range的正確使用姿勢,那么我們下面這個例子也能迎刃而解了:

package mainimport "fmt"type MyType struct { field string}func main() { var array [10]MyType for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") }}

平常寫代碼最常見的場景,就是我們需要在一個循環中修改被遍歷元素的值。比如上面這個例子,我們希望能使用for…range循環,一次性將array中每個元素的field設置為”foo”。同樣,因為range值拷貝的緣故,上面的程序什么都不會輸出……

而正確的做法是:

for i, _ := range array { array[i].field = "foo"}

通過index訪問每個元素,并修改其field,這樣,就能輸出一堆”foo”了……

實驗代碼如下:

package mainimport "fmt"type MyType struct { field string}func main() { var array [10]MyType for i, _ := range array { array[i].field = "foo" } for _, e := range array { fmt.Println(e.field) }}

總結

以上就是關于Go語言中Range關鍵字的全部內容,這篇文章介紹的還是很詳細的,相信本文會對大家學習Go語言具有一定的參考價值,如果有疑問大家可以留言交流,小編會盡快給大家回復的,也請大家繼續支持VEVB武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久99久久精品女同性| 91久久中文字幕| 日韩av在线免费观看一区| 欧美激情一区二区三区高清视频| 欧美电影免费播放| 57pao精品| 亚洲最新在线视频| 欧美老女人性生活| 亚洲精品电影在线观看| 一区二区三区视频观看| 都市激情亚洲色图| 欧美极品在线视频| 狠狠躁夜夜躁人人爽超碰91| 青青草原成人在线视频| 亚洲一区二区三区香蕉| 国产女人18毛片水18精品| 久久久久久国产精品三级玉女聊斋| 欧美成人在线免费视频| 亚洲成人激情在线| 欧美日本亚洲视频| 精品久久久久久久久中文字幕| 国产精品1区2区在线观看| 久久综合久久美利坚合众国| 免费97视频在线精品国自产拍| 久久午夜a级毛片| 992tv在线成人免费观看| 亚洲一区美女视频在线观看免费| 亚洲美女在线看| 理论片在线不卡免费观看| 中文字幕免费精品一区高清| 国产精品福利片| 亚洲欧美中文字幕| 成人精品网站在线观看| 亚洲精品久久久久国产| 热久久这里只有| 欧美日韩另类在线| 成人97在线观看视频| 日韩美女主播视频| 国产精品啪视频| 欧美xxxx18性欧美| 亚洲国产成人av在线| 色偷偷88888欧美精品久久久| 91人人爽人人爽人人精88v| 97精品在线观看| 欧美风情在线观看| 国产精品色午夜在线观看| 国产精品久久视频| 国产精品九九九| 精品高清一区二区三区| 91欧美视频网站| 亚洲自拍另类欧美丝袜| 欧美性xxxxx极品娇小| 日韩电影大全免费观看2023年上| 欧美性感美女h网站在线观看免费| 日本aⅴ大伊香蕉精品视频| 久久在线免费视频| 亚洲伊人久久大香线蕉av| 欧美激情a在线| 欧美午夜视频在线观看| 欧美成人中文字幕在线| 国产亚洲欧美一区| 日本精品久久久久影院| 日韩毛片在线看| 97色伦亚洲国产| 日韩av影视综合网| 性金发美女69hd大尺寸| 欧美高清一级大片| 亚洲性夜色噜噜噜7777| 亚洲一区二区三区香蕉| 欧美中文字幕第一页| 成人免费xxxxx在线观看| 最新日韩中文字幕| 久久影视电视剧凤归四时歌| 久久久国产视频91| 欧美成人在线免费视频| 国产一区二区三区中文| 亚洲欧洲偷拍精品| 国产精品户外野外| 日韩av在线看| 国产精品福利在线观看网址| 色偷偷噜噜噜亚洲男人的天堂| 亚洲精品www久久久久久广东| 亚洲男人天堂2024| 日本中文字幕久久看| 日韩视频永久免费观看| 欧美极品少妇xxxxⅹ喷水| 国产精品成人va在线观看| 综合欧美国产视频二区| 韩国三级电影久久久久久| 欧美午夜精品伦理| 亚洲天堂av女优| 亚洲国产成人在线视频| 国产免费一区二区三区香蕉精| 亚洲激情电影中文字幕| 色诱女教师一区二区三区| 九色精品免费永久在线| 91成品人片a无限观看| 欧美激情在线观看| 成人97在线观看视频| 欧美疯狂xxxx大交乱88av| 国产欧美精品xxxx另类| 国产在线拍偷自揄拍精品| 久久国产精彩视频| 久久亚洲国产成人| 日韩av在线高清| 欧美精品在线免费播放| 日韩二区三区在线| 国产日韩专区在线| 久久影院资源网| 成人激情黄色网| 日韩av手机在线| 国产欧美日韩视频| 欧美国产亚洲精品久久久8v| 欧美超级乱淫片喷水| 国产成人精彩在线视频九色| 中文字幕亚洲天堂| 欧美电影电视剧在线观看| 欧美另类极品videosbestfree| 欧美福利视频在线| 欧美日韩国产综合新一区| 国产欧美亚洲精品| 亚洲电影成人av99爱色| 大伊人狠狠躁夜夜躁av一区| 日韩视频中文字幕| 亚洲а∨天堂久久精品喷水| 久久久久久久久久久久久久久久久久av| 色一情一乱一区二区| 欧美理论在线观看| y97精品国产97久久久久久| 久久久综合av| 久久久久久久久亚洲| 亚洲免费视频在线观看| 国产美女精品视频免费观看| 中文字幕在线看视频国产欧美在线看完整| 最近日韩中文字幕中文| 亚洲一区二区三区在线免费观看| 97涩涩爰在线观看亚洲| 国产欧美精品在线| 亚洲一区亚洲二区亚洲三区| 中文字幕亚洲图片| 国a精品视频大全| 欧美日韩色婷婷| 国产精品成人一区二区| 国产日韩欧美另类| 久久久午夜视频| 精品一区精品二区| 久久99精品久久久久久青青91| 国语自产精品视频在线看一大j8| 国产精品亚洲精品| 亚洲国产精品一区二区三区| 欧美日韩国产123| 国产中文字幕91| 搡老女人一区二区三区视频tv| 久久国内精品一国内精品| 欧美老女人在线视频| 亚洲色图欧美制服丝袜另类第一页| 国产专区精品视频| 亚洲欧美日韩区| 久久亚洲精品国产亚洲老地址| 91极品视频在线| 日韩av大片免费看| 一级做a爰片久久毛片美女图片| 欧美激情亚洲综合一区| 国产精品久久久久久久9999|