哈希表是計算機科學(xué)中最重要的數(shù)據(jù)結(jié)構(gòu)之一。許多哈希表的實現(xiàn)有著千差萬別的特性,但是總體上他們都提供了快速查詢,添加和刪除功能。go語言提供了內(nèi)置數(shù)據(jù)類型map。

成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為兩當(dāng)?shù)确?wù)建站,兩當(dāng)?shù)鹊仄髽I(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為兩當(dāng)企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
映射是一種內(nèi)置的數(shù)據(jù)結(jié)構(gòu),用來保存鍵值對的無序集合。
map的聲明格式如下:
1、map[KeyType] ValueType
KeyType類型必須是可以比較的,而ValueType可以是任意類型,甚至是另一個map
2、以下這個m是一個鍵值為string,值為int的哈希表:var m map[string]int
3、哈希表類型是引用類型,像指針或者切片m指向的值是nil;它沒有指向一個初始化了的哈希表。一個nil哈希表在讀的時候,像一個空的哈希表,但是嘗試向m中寫數(shù)據(jù)會引發(fā)一個運行時panic,所以別那樣做。 使用內(nèi)置函數(shù)make初始化一個哈希表
m = make(map[string]int)//make函數(shù)申請并初始化了一個哈希表的數(shù)據(jù)結(jié)構(gòu)并且返回一個指向這個初始化好了的哈希表
映射的創(chuàng)建:
1、make(map[KeyType]ValueType,initialCapacity)
2、make(map[KeyType]ValueType)
3、map[KeyType]ValueType{}
4、map[KeyType]ValueType{key1:value1,key2:value2.....,keyN:valueN}
egg:
package main
import "fmt"
func main() {map1 := make(map[string]string, 5)
map2 := make(map[string]string)
map3 := map[string]string{} map4 := map[string]string{"a": "1", "b": "2", "c": "3"}fmt.Println(map1, map2, map3, map4)
}
映射的填充和遍歷
package main
import "fmt"
func main() {map1 := make(map[string]string)
map1["a"] = "1"
map1["b"] = "2"
map1["c"] = "3"
fmt.Println(map1)
for key, value := range map1 { fmt.Printf("%s--->%s\n", key, value)}
}
##map是對key-value的遍歷,直接操作value是值得拷貝,只有對key的操作才是修改value
package main
import "fmt"
func main() {
sm := make([]map[int]string, 5)
for _, value := range sm {
value = make(map[int]string, 1)
value[1] = "OK"
fmt.Println(value)
}
fmt.Println(sm)
}
C:/Users/cherry/go/src/test/test.exe [C:/Users/cherry/go/src/test]
map[1:OK]
map[1:OK]
map[1:OK]
map[1:OK]
map[1:OK]
[map[] map[] map[] map[] map[]]
值得拷貝操作
####
package mainimport "fmt"
func main() {sm := make([]map[int]string, 5)
for i := range sm {sm[i] = make(map[int]string, 1)
sm[i][1] = "OK"
fmt.Println(sm[i])
}
fmt.Println(sm)
}
映射的查找、修改和刪除
package main
import "fmt"
func main() { map1 := map[string]string{"a": "1", "b": "2", "c": "3"}val, exist := map1["a"] //
val2, exist2 := map1["d"]
fmt.Printf("%v,%v\n", exist, val) fmt.Printf("%v,%v\n", exist2, val2)map1["a"] = "9" //修改
fmt.Printf("%v\n", map1)delete(map1, "b")\\刪除
fmt.Printf("%v\n", map1)}
map指定key取對應(yīng)的value時,可以指定返回兩個值,第一個是對應(yīng)的value,第二個是一個bool,表示是否有值。如上,"a"肯定有值,"b"肯定沒值,修改映射和添加映射的操作沒什么區(qū)別,若指定的鍵不存在則創(chuàng)建,否則,修改之
MAP并發(fā):
哈希表在有并發(fā)的場景并不安全:同時讀寫一個哈希表的后果是不確定的。如果你需要使用goroutines同時對一個哈希表做讀寫,對哈希表的訪問需要通過某種同步機制做協(xié)調(diào)。一個常用的方法是是使用 sync.RWMutex。
這個語句生命了一個counter變量,這是一個包含了一個map和sync.RWMutex的匿名結(jié)構(gòu)體
##當(dāng)map多層嵌套的時候,需要對它進行初始化操作,如:egg:
package main
import "fmt"
func main() {var m map[int]map[int]string
m = make(map[int]map[int]string) //這里其實只對外層的map做了初始化操作
a, ok := m[2][1]
fmt.Println(a, ok)
if !ok {m[2] = make(map[int]string)
}
m[2][1] = "Good1"
a, ok = m[2][1]
fmt.Println(a, ok)
}
分享標題:GO之MAP的使用
標題來源:http://chinadenli.net/article46/isggeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、企業(yè)網(wǎng)站制作、微信小程序、網(wǎng)站維護、網(wǎng)站設(shè)計、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)