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

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

 更新時間:2021年04月26日 08:32:58   作者:qauzy  
這篇文章主要介紹了golang中for range的取地址操作陷阱,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

例子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 我們預期輸出0,1,2,3,例子2 我們預期輸出a,b, c,但兩個例子的輸出都不是我們預期的。

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

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

補充:golang取地址操作采坑:for idx,item := range arr中的item是個獨立對象

先看代碼:

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)
    }
}

運行輸出:

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的地址,結果所有map中的值都指向最后一個!

看來item是一個獨立對象,這個對象指向了數(shù)組中的對應元素。

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

相關文章

  • golang中defer的關鍵特性示例詳解

    golang中defer的關鍵特性示例詳解

    defer是golang語言中的關鍵字,用于資源的釋放,會在函數(shù)返回之前進行調(diào)用。下面這篇文章主要給大家介紹了關于golang中defer的關鍵特性,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • golang實現(xiàn)給圖片加水印

    golang實現(xiàn)給圖片加水印

    這篇文章主要為大家詳細介紹了Vue3如何利用golang實現(xiàn)給圖片加水印,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-12-12
  • Golang?reflect反射的使用實例

    Golang?reflect反射的使用實例

    Golang反射的錯誤大多數(shù)都來自于調(diào)用了一個不適合當前類型的方法,而且,這些錯誤通常是在運行時才會暴露出來,而不是在編譯時,如果我們傳遞的類型在反射代碼中沒有被覆蓋到那么很容易就會panic,本文就介紹一下使用go反射時很大概率會出現(xiàn)的錯誤,需要的可以參考一下
    2023-04-04
  • 利用ChatGPT編寫一個Golang圖像壓縮函數(shù)

    利用ChatGPT編寫一個Golang圖像壓縮函數(shù)

    這篇文章主要為大家詳細介紹了如何利用ChatGPT幫我們寫了一個Golang圖像壓縮函數(shù),文中的示例代碼簡潔易懂,感興趣的小伙伴可以嘗試一下
    2023-04-04
  • go處理線程之間的交互示例代碼

    go處理線程之間的交互示例代碼

    Go語言以goroutine為核心實現(xiàn)并發(fā)編程,其中線程間交互主要通過Channels、WaitGroup、Mutex和Select實現(xiàn),Channels提供goroutine間的數(shù)據(jù)傳遞,本文給大家介紹go處理線程之間的交互示例代碼,感興趣的朋友一起看看吧
    2024-10-10
  • golang中byte和rune用法及新手易錯點總結

    golang中byte和rune用法及新手易錯點總結

    golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關于golang中byte和rune用法及新手易錯點總結的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Go語言使用對稱加密的示例詳解

    Go語言使用對稱加密的示例詳解

    在項目開發(fā)中,我們經(jīng)常會遇到需要使用對稱密鑰加密的場景,比如客戶端調(diào)用接口時,參數(shù)包含手機號、身份證號或銀行卡號等。本文將詳細講解Go語言使用對稱加密的方法,需要的可以參考一下
    2022-06-06
  • 深入理解go sync.Once的具體使用

    深入理解go sync.Once的具體使用

    在很多情況下,我們可能需要控制某一段代碼只執(zhí)行一次,go 為我們提供了?sync.Once?對象,它保證了某個動作只被執(zhí)行一次,本文主要介紹了深入理解go sync.Once的具體使用,感興趣的可以了解一下
    2024-01-01
  • go時間/時間戳操作大全(小結)

    go時間/時間戳操作大全(小結)

    這篇文章主要介紹了go時間/時間戳操作大全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Go語言中兩個比較流行的緩存庫使用示例

    Go語言中兩個比較流行的緩存庫使用示例

    緩存是計算機科學中的一個重要概念,設想某個組件需要訪問外部資源,它向外部源請求資源,接收并使用資源,這些步驟都需要花費時間,下面這篇文章主要給大家介紹了關于Go語言中兩個比較流行的緩存庫使用的相關資料,需要的朋友可以參考下
    2024-04-04

最新評論

思茅市| 溧水县| 商南县| 黄山市| 光山县| 满城县| 建宁县| 海林市| 安远县| 资溪县| 门头沟区| 遵义县| 资源县| 济南市| 屯门区| 右玉县| 锡林浩特市| 岳阳县| 东阳市| 龙里县| 广水市| 个旧市| 邻水| 綦江县| 宜州市| 台北县| 沙坪坝区| 漳浦县| 太原市| 澳门| 偃师市| 大洼县| 天津市| 东丰县| 阜宁县| 长武县| 大城县| 黄平县| 呼图壁县| 将乐县| 和田市|