最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO常見的錯誤99%程序員會遇到(解決方法)

 更新時間:2020年01月10日 08:52:59   作者:A_文藝欽年 ·  
這篇文章主要介紹了GO常見的錯誤99%程序員會遇到,本文給出了解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

新學(xué)習(xí)go語言的人可能遇到常見的錯誤,其中有兩個比較常見的錯誤,需要單獨(dú)拿出來說下,為什么要單獨(dú)說呢,因?yàn)檫@兩個錯誤跟其他語言不同,是因?yàn)間o本身的設(shè)計造成的。

在循環(huán)(迭代)中使用了變量的引用

在go語言中,循環(huán)(迭代)所使用的變量是同一個變量,只是在每次循環(huán)的時候被賦于不同的值,這樣的做的目的呢,當(dāng)然是出于高效考慮咯。但是,如果使用不當(dāng)?shù)脑?,可能會引起意想不到的行為?/p>

舉一個栗子:

func main() {
 var out []*int
 for i := 0; i < 3; i++ {
 out = append(out, &i)
 }
 fmt.Println("Values:", *out[0], *out[1], *out[2])
 fmt.Println("Addresses:", out[0], out[1], out[2])
}

上面的代碼會輸出:

Values: 3 3 3
Addresses: 0x40e020 0x40e020 0x40e020

因?yàn)槊看窝h(huán)中,我們只是把變量 i 的地址放進(jìn) out 數(shù)組里,因?yàn)樽兞?nbsp;i 是同一個變量,只有在循環(huán)結(jié)束的時候,被賦值為3。

解決方法:申明一個新的變量

for i := 0; i < 3; i++ {
 i := i // Copy i into a new variable.
 out = append(out, &i)
 }

結(jié)果

Values: 0 1 2
Addresses: 0x40e020 0x40e024 0x40e028

同理對于切片來說,也用有這個問題,因?yàn)榍衅旧砭椭皇且粋€地址而已

func main() {
 var out [][]int
 for _, i := range [][1]int{{1}, {2}, {3}} {
 out = append(out, i[:])
 }
 fmt.Println("Values:", out)
}

結(jié)果:

Values: [[3] [3] [3]]

同樣的問題,在循環(huán)里使用協(xié)程也會遇到

在協(xié)程中使用循環(huán)變量

按照程序員的思維,都喜歡使用并發(fā),你可能會寫出下面的代碼: 心里特別開心,原來go 的并發(fā)這么簡單。

for _, val := range values {
 go func() {
   fmt.Println(val)
 }()
}

但是,你可能會發(fā)現(xiàn)輸出的結(jié)果是一摸一樣的! 因?yàn)間o的協(xié)程跑起來也是需要一點(diǎn)時間的,循環(huán)結(jié)束的時候,可能一個goroute都沒有跑完,然后 val 值確被賦值了,所以,你會看到,輸出的都是最后一個值

解決方法:

for _, val := range values {
 go func(val interface{}) {
 fmt.Println(val)
 }(val)
}

當(dāng)然也可以

for i := range valslice {
 val := valslice[i]
 go func() {
 fmt.Println(val)
 }()
}

Reference: github.com/golang/go/w…

總結(jié)

以上所述是小編給大家介紹的GO常見的錯誤99%程序員會遇到,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

最新評論

景德镇市| 响水县| 浦江县| 临海市| 葵青区| 鄂伦春自治旗| 津市市| 满城县| 尖扎县| 张掖市| 安多县| 田阳县| 辽源市| 将乐县| 庆阳市| 嘉峪关市| 宁南县| 乌拉特中旗| 嫩江县| 万安县| 井研县| 丰原市| 阳原县| 嘉峪关市| 观塘区| 道真| 临夏市| 青铜峡市| 安新县| 旬邑县| 宝鸡市| 巴塘县| 望城县| 滦南县| 米易县| 桐乡市| 鸡泽县| 长白| 明水县| 耿马| 辽源市|