這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1 map簡介
map是一堆索引值對的未排序集合,類似Python中字典的概念,它的格式為map[keyType]valueType,是一個key-value的hash結構。map的讀取和設定也類似slice一樣,通過key來操作,只是slice的index只能是int類型,而map多了很多類型,可以是int,可以是string及所有完全定義了==與!=操作的類型。
在C++/Java中,map一般都以庫的方式提供,比如在C++中是STL的std::map<>,在Java中是Hashmap<>,在這些語言中,如果要使用map,事先要引用相應的庫。而在Go中,使用map不需要引入任何庫,並且用起來也更加方便。
2 map聲明
聲明map的文法如下
var map變數名 map[key] value
其中:key為鍵類型,value為實值型別
例如:value不僅可以是標註資料類型,也可以是自訂資料類型
var numbers map[string] intvar myMap map[string] personInfo
personInfo為自訂結構體,儲存個人資訊,定義如下
type personInfo struct { ID string Name string Address string}
3 map初始化
3.1 直接初始化(建立)
rating := map[string] float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }myMap := map[string] personInfo{"1234": personInfo{"1", "Jack", "Room 101,..."},}
3.2 通過make初始化(建立)
Go語言提供的內建函數make()可以用於靈活地建立map。
建立了一個鍵類型為string,實值型別為int的map
numbers := make(map[string] int)
建立了一個鍵類型為string,實值型別為personInfo的map
myMap = make(map[string] personInfo)
也可以選擇是否在建立時指定該map的初始儲存能力,如建立了一個初始儲存能力為5的map
myMap = make(map[string] personInfo, 5)
建立後初始化如下:
numbers["one"] = 1 myMap["1234"] = personInfo{"1", "Jack", "Room 101,..."}
4 map元素尋找
在Go語言中,map的尋找功能設計得比較精巧。判斷是否成功找到特定的鍵,不需要檢查取到的值是否為nil,只需查看第二個傳回值。要從map中尋找一個特定的鍵,可以通過下面的代碼來實現:
value, ok := myMap["1234"]if ok{ //處理找到的value}
5 map元素修改(賦值)
5.1 直接修改
numbers["one"] = 11
5.2 間接修改
map是一種參考型別,如果兩個map同時指向一個底層,那麼一個改變,另一個也相應的改變。
numbersTest := numbersnumbersTest["one"] = "111"
現在numbers["one"]的值變為"111"了。
6 map元素刪除
Go語言提供了一個內建函數delete(),用於刪除容器內的元素。如
delete(number, "one")
上面的代碼將從myMap中刪除鍵為“one”的索引值對。如果“one”這個鍵不存在,那麼這個調用將什麼都不發生,也不會有什麼副作用。但是如果傳入的map變數的值是nil,該調用將導致程式拋出異常(panic)。
7 執行個體代碼
package mainimport( "fmt")type persionInfo struct{ ID string Name string Address string}func main(){ /* //聲明一個map變數numbers,鍵名為string,值為int var numbers map[string] int //給map變數建立值,同時指定最多可以儲存3個int值 numbers = make(map[string] int, 3) //map元素賦值 numbers["one"] = 1 numbers["two"] = 2 numbers["three"] = 3 */ //上面方式的簡寫方法 numbers := map[string] int{ "one": 1, "two": 2, "three": 3, } var myMap map[string] persionInfo myMap = make(map[string] persionInfo) myMap["persion1"] = persionInfo{"1", "Amiee", "Street 101"} myMap["persion2"] = persionInfo{"2", "Beva", "Street 102"} myMap["persion3"] = persionInfo{"3", "Cencey", "Street 103"} /* // 上面方式的簡寫方法 myMap := map[string] persionInfo{ "persion1": persionInfo{"1", "Amiee", "Street 101"}, "persion2": persionInfo{"2", "Beva", "Street 102"}, "persion3": persionInfo{"3", "Cencey", "Street 103"}, } */ //map元素列印 fmt.Printf("%v\n", numbers) fmt.Println(numbers) fmt.Println(numbers["two"]) fmt.Println(myMap) fmt.Println(myMap["persion1"]) //map元素尋找 p1, ok := myMap["persion1"] if ok{ fmt.Println("Found persion1, name", p1.Name, ", info", p1 ) }else{ fmt.Println("Not Found persion1") } //map元素修改 //map是一種參考型別,如果兩個map同時指向一個底層,那麼一個改變,另一個也相應的改變。 numbersTest := numbers numbersTest["one"] = 11 fmt.Println(numbers) //map元素刪除 delete(numbers, "one") fmt.Println(numbers) }
輸出結果如下
[root@localhost mygo]# go run test.go map[one:1 two:2 three:3]map[one:1 two:2 three:3]2map[persion1:{1 Amiee Street 101} persion2:{2 Beva Street 102} persion3:{3 Cencey Street 103}]{1 Amiee Street 101}Found persion1, name Amiee , info {1 Amiee Street 101}map[one:11 two:2 three:3]map[two:2 three:3]
8 注意事項
map是無序的,每次列印出來的map都會不一樣,它不能通過index擷取,而必須通過key擷取。
map的長度是不固定的,也就是和slice一樣,也是一種參考型別。
內建的len函數同樣適用於map,返回map擁有的key的數量。
map的值可以很方便的修改,通過重新賦值即可。
<關鍵字:map make delete >
**********************************************************************************************
轉載請註明出處:http://blog.csdn.net/jesseyoung/article/details/34949845
**********************************************************************************************