散列值的做用java
映射中數據的刪除c++
// 建立一個鍵爲字符串類型,值爲整形的map m1 := map[string]int{"last":2019, "now":2020} // 獲取map中的元素 fmt.Println(m1["last"]) // 2019 fmt.Println(m1["now"]) // 2020 // 使用字面量建立一個空map m2 := map[string]string{} fmt.Println(m2) // map[]
映射的鍵的類型能夠是內置類型,也能夠是結構類型,但 這個類型必須可使用==運算符作比較。切片,函數以及包含切片的結構類型因爲具備引用語義,不能做爲映射的鍵,不然會形成編譯錯誤。
m1 := make(map[int] string) // map的容量使用默認值 m1[1] = "lioney" m2 := make(map[int] string, 10) // map的容量使用給定值 m2[1] = "carlos" fmt.Println(m1[1]) // lioney fmt.Println(m2[1]) // carlos
package main import "fmt" func main() { // 建立一個空的map m1 := make(map[int] string) // 向map中添加元素 m1[1] = "lioney" m1[2] = "carlos" m1[3] = "tom" // 從map中刪除鍵爲3的元素 delete(m1, 3) // len()表示map中鍵值對的數量 fmt.Println("len=", len(m1)) // 遍歷map for k, v := range m1 { fmt.Println("key=", k, "value=", v) } }
上述代碼編譯後運行結果以下:
len= 2 key= 2 value= carlos key= 1 value= lioney Process finished with exit code 0
和切片相似,映射在使用時必須對其底層數組進行初始化,要麼使用make進行初始化,要麼使用字面量初始化,若是隻是簡單地聲明瞭一個map,而沒有進行初始化,就是nil映射,是不能對其賦值的,請看下面代碼:
// 聲明一個map var colors map[string]string // 將red加入colors colors["red"] = "#da137" // panic: assignment to entry in nil map
能夠作以下修改:
// 聲明一個map var colors map[string]string // 對map進行初始化 colors = make(map[string]string) // 將red加入colors colors["red"] = "#da137" // no panic or error
也能夠作以下修改:
// 使用字面量建立要給空map colors := map[string]string{} // 將red加入colors colors["red"] = "#da137" // no panic or error
強烈推薦使用第二種,由於用字面量建立map比較簡潔並且比較快
在Go語言裏,經過鍵來索引值時,即使這個鍵不存在也會返回一個值,有時候咱們須要判斷獲取到的值是否時默認的零值,代碼以下所示。
// 使用字面量建立一個空map colors := map[string]string{} // 將red加入colors colors["red"] = "#da137" // 獲取blue對應的值並判斷是否爲零值 value1, exists := colors["blue"] if exists { fmt.Println(value1) } // 也能夠經過值直接判斷是否爲零值 value2 := colors["blue"] if value2 != "" { fmt.Println(value2) }
package main import ( "fmt" "unsafe" ) func foo(m map[string]string) { // 打印參數的大小 fmt.Println("參數大小", unsafe.Sizeof(m)) // 刪除鍵爲green的元素 delete(m, "green") } func main() { // 使用字面量建立一個空map colors := map[string]string{} // 將red加入colors colors["red"] = "#da137" colors["coral"] = "#ff7f50" colors["green"] = "#228b22" // 調用foo函數 foo(colors) // 遍歷打印map for k, v := range colors { fmt.Println("key=", k, "value=", v) } }
編譯並運行以上代碼,結果以下:
參數大小 8 key= red value= #da137 key= coral value= #ff7f50 Process finished with exit code 0
映射是引用類型的數據結構,在函數間傳遞映射的時候,不會拷貝映射底層的數據,從上面代碼的運行結果能夠看出,只傳遞了一個8字節大小的指針, 實際上,map類型就是一個指針類型,函數對映射的操做都是經過這個指針間接進行的,所以對映射中數據的修改,其它引用到該映射的地方也能感知到。
package main import "fmt" type User struct { name string age int } func main() { m := make(map[int]User) user := User{ name: "lioney", age: 18, } // 將user加入到map中 m[1] = user // 修改user // 不能經過map引用直接修改!!! //m[1].age = 2 // error: cannot assign to struct field m[1].age in map // 必須總體替換 user.age = 2 m[1] = user fmt.Println(m) }
Go語言內置的map不是併發安全的,如果在併發場景下以共享的形式訪問map中的元素,必須加鎖,要想使用併發安全的map,可使用Go語言標準庫中sync包下提供的map。
我是lioney,年輕的後端攻城獅一枚,愛鑽研,愛技術,愛分享。
我的筆記,整理不易,感謝閱讀、點贊和收藏。
文章有任何問題歡迎你們指出,也歡迎你們一塊兒交流後端各類問題!