go語言---map

來源:互聯網
上載者:User

標籤:語言   err   write   ssi   成員   方式   集合   賦值   用法   

go語言---map78890185一.map的用法:
type PersonDB struct {    Id      string    Name    string    Address string}fmt.Println("=========Map===========")    //map是一堆索引值對的未排序集合,在golang中是內建類型,可以直接使用,不像Java需要引入HashMap    var personMap map[string]PersonDB                                 //聲明一個map變數,string是鍵的類型,PersonDB是值的類型    personMap = make(map[string]PersonDB, 10)                         //建立一個map,初始容量為10    personMap["1"] = PersonDB{Id: "1", Name: "zs", Address: "北京市房山區"} //給map元素賦值    personMap["2"] = PersonDB{Id: "2", Name: "ls", Address: "北京市海澱區"}    //使用內建函數delete刪除personMap中key="1"的元素,如果找不到該key,則什麼也不會發生,如果personMap為nil,則拋錯    delete(personMap, "1")    if value, ok := personMap["2"]; ok { //找到key=2的元素,則ok=true,value為找到的值;否則ok=false        fmt.Println(value)    }    personMap2 := map[string]PersonDB{"3": PersonDB{"3", "ww", "杭州市西湖區"}} //建立並初始化一個map    personMap2["4"] = PersonDB{"4", "ll", "北京市東城區"}    for k, v := range personMap2 { //使用range遍曆map中的元素        fmt.Println(k, v)        if k == "3" {            v.Name = "wwUpdate"            personMap2["3"] = v //可更改value值            //以下這種賦值方式會報錯,只能對value賦值,不能直接更改其成員變數            // personMap2["3"].Name = "wwUpdate" //cannot assign to struct field personMap2["3"].Name in map        }    }    fmt.Println(personMap2)    

輸出結果:
fatal error: concurrent map writes
由結果可知:map不是安全執行緒的。
至於為什麼不是安全執行緒,以後再分析

三.map傳值還是傳引用?

運行以下代碼:

//map傳值還是傳引用? map和slice,channel一樣,內部都有一個指向真正儲存空間的指標,所以,即使傳參時是對值的複製(傳值),但都指向同一Block Storage空間。    var myMapV map[string]int    var myMap1 map[string]int    myMapV = map[string]int{"value": 0}    myMap1 = myMapV    fmt.Println("m =", myMapV)    fmt.Println("m1 =", myMap1)    myMap1["value"] = 1    fmt.Println("m =", myMapV)    fmt.Println("m1 =", myMap1)
二.map是安全執行緒的嗎?

運行以下代碼:

//map不是安全執行緒的。     cMap := make(map[string]int)    for i := 0; i < 100; i++ {        go func() {            for j := 0; j < 100; j++ {            cMap[fmt.Sprintf("%d", j)] = j //fatal error: concurrent map writes            }        }()    }     time.Sleep(3 * time.Second)

輸出結果:
m = map[value:0]
m1 = map[value:0]
m = map[value:1]
m1 = map[value:1]
我們發現,當修改了m1,m也隨著改變了,這看似是傳引用,但其實map也是傳值的,它的原理和數組切片類似。map內部維護著一個指標,該指標指向真正的map儲存空間。我們可以將map描述為如下結構:

type map[key]value struct{
impl *Map_K_V
}
type Map_K_V struct{
//......
}
其實,map和slice,channel一樣,內部都有一個指向真正儲存空間的指標,所以,即使傳參時是對值的複製(傳值),但都指向同一Block Storage空間。

go語言---map

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.