濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > golang中for range的取地址操作陷阱介紹

golang中for range的取地址操作陷阱介紹

熱門標(biāo)簽:外呼系統(tǒng)用什么卡 評(píng)價(jià)高的400電話辦理 百度地圖標(biāo)注后傳給手機(jī) 阿克蘇地圖標(biāo)注 壽光微信地圖標(biāo)注 電話機(jī)器人軟件免費(fèi) 涿州代理外呼系統(tǒng) excel地圖標(biāo)注分布數(shù)據(jù) 外呼系統(tǒng)顯本地手機(jī)號(hào)

Tips:for range創(chuàng)建了每個(gè)元素的副本,而不是直接返回每個(gè)元素的引用

例子1:

package main
import "fmt"
func main() {
 slice := []int{0, 1, 2, 3}
 myMap := make(map[int]*int)
 for index, value := range slice {
  myMap[index] = value
 }
 fmt.Println("=====new map=====")
 prtMap(myMap)
}
 
func prtMap(myMap map[int]*int) {
 for key, value := range myMap {
  fmt.Printf("map[%v]=%v\n", key, *value)
 }
}

輸出:

dotzdeMacBook-Pro-2:src dotz$ ./range

=====new map=====

map[0]=3

map[1]=3

map[2]=3

map[3]=3

例子2:

package main  
import "fmt"  
type Test struct {
    name string
}
 
func (this *Test) Point() { // this  為指針
    fmt.Println(this.name)
}
  
func main() {  
    ts := []Test{{"a"}, {"b"}, {"c"}}
    for _, t := range ts {
        defer t.Point() //輸出 c c c
    } 
} 

輸出:

dotzdeMacBook-Pro-2:src dotz$ ./method

c

c

c

例子1 我們預(yù)期輸出0,1,2,3,例子2 我們預(yù)期輸出a,b, c,但兩個(gè)例子的輸出都不是我們預(yù)期的。

對(duì)于例子1,比較明顯,執(zhí)行了取地址操作,每次都取value變量的地址,所以最后map中的所有元素的值都是value變量的地址(引用),因?yàn)樽詈髒alue被賦值為3,所有輸出都是3.

對(duì)于例子2,隱晦一點(diǎn),夾雜了defer和方法接收者的規(guī)則,但其實(shí)也和例子1一樣,執(zhí)行t.Point()時(shí),得到的是t的地址(引用),for結(jié)束時(shí),t被賦值為”c“的地址,main函數(shù)返回時(shí),都在執(zhí)行”c“的接收方法Point,所以輸出都是”c".

補(bǔ)充:golang取地址操作采坑:for idx,item := range arr中的item是個(gè)獨(dú)立對(duì)象

先看代碼:

package main
import "fmt"
func main() {
    type s struct {
        A string
        B int32
    }
    arr := []s{
        {"123", 123},
        {"456", 456},
        {"789", 789},
    }
    m := make(map[string]*s)
    for idx, item := range arr {
        m[item.A] = item
        fmt.Printf("idx=%d, addr=%p, item addr=%p\n", idx, arr[idx], item)
    }
    for k, v := range m {
        fmt.Printf("key=%s, v=%+v\n", k, v)
    }
}

運(yùn)行輸出:

idx=0, addr=0xc00004e050, item addr=0xc0000044a0

idx=1, addr=0xc00004e068, item addr=0xc0000044a0

idx=2, addr=0xc00004e080, item addr=0xc0000044a0

key=123, v={A:789 B:789}

key=456, v={A:789 B:789}

key=789, v={A:789 B:789}

我傻傻的在循環(huán)中取item的地址,結(jié)果所有map中的值都指向最后一個(gè)!

看來(lái)item是一個(gè)獨(dú)立對(duì)象,這個(gè)對(duì)象指向了數(shù)組中的對(duì)應(yīng)元素。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 基于golang中container/list包的用法說(shuō)明
  • Golang中List的實(shí)現(xiàn)方法示例詳解
  • golang使用grpc+go-kit模擬oauth認(rèn)證的操作
  • golang如何去除多余空白字符(含制表符)
  • 用golang如何替換某個(gè)文件中的字符串
  • golang正則之命名分組方式
  • 解決golang中container/list包中的坑

標(biāo)簽:梅河口 銅川 重慶 蘭州 欽州 雞西 吐魯番 汕頭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang中for range的取地址操作陷阱介紹》,本文關(guān)鍵詞  golang,中,for,range,的,取,地址,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang中for range的取地址操作陷阱介紹》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang中for range的取地址操作陷阱介紹的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    赤壁市| 原阳县| 肃宁县| 突泉县| 濉溪县| 上犹县| 东辽县| 额济纳旗| 古田县| 辽中县| 丰台区| 永济市| 德昌县| 泌阳县| 沙河市| 肥城市| 武邑县| 泸西县| 巴马| 阳高县| 四平市| 邓州市| 遂溪县| 正阳县| 崇左市| 上思县| 会东县| 郁南县| 新巴尔虎左旗| 东乡县| 荣成市| 阳高县| 江口县| 丘北县| 濉溪县| 安平县| 平安县| 钟山县| 西安市| 井陉县| 鹿泉市|