国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - 淺析Go語(yǔ)言中的Range關(guān)鍵字

淺析Go語(yǔ)言中的Range關(guān)鍵字

2020-05-03 12:45daisy Golang

Range是go語(yǔ)言中很獨(dú)特的一個(gè)關(guān)鍵詞,也相當(dāng)好用。下面就跟著小編來(lái)再聊聊這個(gè)Range關(guān)鍵字,有需要的朋友們可以參考借鑒。

前言

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

比如像這樣的用法:

?
1
2
3
4
for index, value := range mySlice {
 fmt.Println("index: " + index)
 fmt.Println("value: " + value)
}

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

為了說(shuō)明這些”坑”,我們可以從下面這個(gè)稍復(fù)雜的例子說(shuō)起:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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])
}

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

     1、定義了一個(gè)叫做Foo的結(jié)構(gòu),里面有一個(gè)叫bar的field。隨后,我們創(chuàng)建了一個(gè)基于Foo結(jié)構(gòu)體的slice,名字叫l(wèi)ist

     2、我們還創(chuàng)建了一個(gè)基于Foo結(jié)構(gòu)體指針類(lèi)型的slice,叫做list2

     3、在一個(gè)for循環(huán)中,我們?cè)噲D遍歷list中的每一個(gè)元素,獲取其指針地址,并賦值到list2中index與之對(duì)應(yīng)的位置。

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

從代碼來(lái)看,理所當(dāng)然,我們期望得到的結(jié)果應(yīng)該是這樣:

?
1
2
{A} {B} {C}
&{A} &{B} &{C}

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

?
1
2
{A} {B} {C}
&{C} &{C} &{C}

從結(jié)果來(lái)看,仿佛list2中的三個(gè)元素,都指向了list中的最后一個(gè)元素。這是為什么呢?問(wèn)題就出在上面那一段for…range循環(huán)中。

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

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

?
1
2
3
4
5
var value Foo
for var i := 0; i < len(list); i++ {
 value = list[i]
 list2[i] = &value
}

如果我們輸出list2的三個(gè)元素,結(jié)果同樣是: &{C} &{C} &{C}

那么,怎樣才是正確的寫(xiě)法呢?我們應(yīng)該用index來(lái)訪問(wèn)for…range中真實(shí)的元素,并獲取其指針地址:

?
1
2
3
for i, _ := range list {
 list2[i] = &list[i]
}

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

實(shí)驗(yàn)代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
 
import "fmt"
 
type Foo struct {
 bar string
}
 
func main() {
 list := []Foo{
 {"A"},
 {"B"},
 {"C"},
 }
 
 list2 := make([]*Foo, len(list))
 
 //錯(cuò)誤的例子
 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的正確使用姿勢(shì),那么我們下面這個(gè)例子也能迎刃而解了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import "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("--")
 }
}

平常寫(xiě)代碼最常見(jiàn)的場(chǎng)景,就是我們需要在一個(gè)循環(huán)中修改被遍歷元素的值。比如上面這個(gè)例子,我們希望能使用for…range循環(huán),一次性將array中每個(gè)元素的field設(shè)置為”foo”。同樣,因?yàn)閞ange值拷貝的緣故,上面的程序什么都不會(huì)輸出……

而正確的做法是:

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

通過(guò)index訪問(wèn)每個(gè)元素,并修改其field,這樣,就能輸出一堆”foo”了……

實(shí)驗(yàn)代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import "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)
 }
}

總結(jié)

以上就是關(guān)于Go語(yǔ)言中Range關(guān)鍵字的全部?jī)?nèi)容,這篇文章介紹的還是很詳細(xì)的,相信本文會(huì)對(duì)大家學(xué)習(xí)Go語(yǔ)言具有一定的參考價(jià)值,如果有疑問(wèn)大家可以留言交流,小編會(huì)盡快給大家回復(fù)的,也請(qǐng)大家繼續(xù)支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧...

    天易獨(dú)尊11682021-06-09
  • GolangGolang通脈之?dāng)?shù)據(jù)類(lèi)型詳情

    Golang通脈之?dāng)?shù)據(jù)類(lèi)型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類(lèi)型,在編程語(yǔ)言中標(biāo)識(shí)符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語(yǔ)言中標(biāo)識(shí)符允許由...

    4272021-11-24
  • Golanggolang 通過(guò)ssh代理連接mysql的操作

    golang 通過(guò)ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過(guò)ssh代理連接mysql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說(shuō)起,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看...

    Go語(yǔ)言中文網(wǎng)11352020-05-21
  • Golanggo語(yǔ)言制作端口掃描器

    go語(yǔ)言制作端口掃描器

    本文給大家分享的是使用go語(yǔ)言編寫(xiě)的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    go日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號(hào)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧...

    SmallQinYan12302021-02-02
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产伦精品一区二区三区四区视频 | 一区免费看 | 美日韩免费视频 | 瑟瑟视频在线观看 | 黄色电影在线免费观看 | 青青操av | 亚洲电影天堂在线观看 | 久久久久久久久国产精品 | 在线日本视频 | 亚洲精品成人18久久久久 | 亚洲 欧美 国产 制服 动漫 | 91视频网页版 | 久久久久久综合 | 一呦二呦三呦国产精品 | 国产精品欧美一区二区三区不卡 | 日韩高清一区二区 | 在线视频一区二区 | 久久国产精品久久精品 | 亚洲精品国产电影 | 日韩视频在线观看 | 国产成人99久久亚洲综合精品 | av网站网址| 国产黄色av | 精品综合| 嫩草网址| 日韩电影二区 | 最近日韩中文字幕 | 国产精品久久久久久av下载网址 | 亚洲国产精品久久 | 校园春色av | 久久蜜桃精品一区二区三区综合网 | 精品久久99| 精品久久久久久久 | 成人国产在线 | 在线观看91视频 | 人人射视频 | 91麻豆产精品久久久 | 一区二区乱码 | 奇米在线777 | 国产欧美一区二区精品性色 | 蜜桃臀一区二区三区 |