網(wǎng)站結(jié)構(gòu)與導航設(shè)計/石景山區(qū)百科seo
文章目錄
- Go語言中的map集合
- 1-1 定義
- 1-2 map遍歷
- 1-3 map集合刪除
- 1-4 map是引用類型
Go語言中的map集合
Go 語言提供了內(nèi)置類型 map集合,它將一個值與一個鍵關(guān)聯(lián)起來,可以使用相應(yīng)的鍵檢索值。
- map是一種集合,可以像遍歷數(shù)組或切片那樣去遍歷它。因為map是由Hash表實現(xiàn)的,所以對map的讀取順序不固定。
- map是無序的,每次打印出來的map都會不一樣,它不能通過index獲取,而必須通過key獲取。
- map的長度是不固定的,和切片一樣可以擴展。
內(nèi)置的len()函數(shù)同樣適用于map,返回map擁有的鍵值對的數(shù)量。但是map不能通過cap()函數(shù)計算容量(或者說cap()函數(shù)的參數(shù)不可以是map)。
同一個map中key必須保證唯一。key的數(shù)據(jù)類型必須是可參與比較運算的類型,也就是支持==或!=操作的類型,如布爾型、整型、浮點型、字符串、數(shù)組。切片、函數(shù)等引用類型則不能作為key的數(shù)據(jù)類型。
map的value可以是任何數(shù)據(jù)類型。map和切片一樣,也是一種引用類型。
1-1 定義
- map聲明
- 使用make()函數(shù):
變量名 := make(map[key類型]value類型)
- 該聲明方式,如果不初始化map,map也不等于nil。
- 使用var關(guān)鍵字定義map:
var 變量名 map[key類型] value類型
- 使用var關(guān)鍵字聲明map,未初始化的map的默認值是nil。
- nil map不能存放鍵值對。
- 如果要使用map存儲鍵值對,必須在聲明時初始化,或者使用make()函數(shù)分配到內(nèi)存空間。
- 使用make()函數(shù):
1-2 map遍歷
- map的初始化賦值和遍歷
package mainimport "fmt"func main() {//1、聲明時同時初始化var country = map[string]string{"China": "Beijing","Japan": "Tokyo","India": "New Delhi","France": "Paris","Italy": "Rome",}fmt.Println(country)// 短變量聲明初始化方式rating := map[string]float64{"c": 5, "Go": 4.5, "Python": 4.5, "C++": 3}fmt.Println(rating)//2、創(chuàng)建map后再賦值countryMap := make(map[string]string)countryMap["China"] = "Beijing"countryMap["Japan"] = "Tokyo"countryMap["India"] = "New Delhi"countryMap["France"] = "Paris"countryMap["Italy"] = "Rome"//3、遍歷map(無序)//(1)、key 、value都遍歷for k, v := range countryMap {fmt.Println("國家", k, "首都", v)}fmt.Println("-----------")//(2)、只展示valuefor _, v := range countryMap {fmt.Println("國家", "首都", v)}fmt.Println("-----------")//(3)、只展示keyfor k := range countryMap {fmt.Println("國家", k, "首都", countryMap[k])}
}
- 查看元素在集合中是否存在
- 可以通過key獲取map中對應(yīng)的value值。語法為:map[key]。
- 當key不存在時,會得到該value值類型的默認值,比如string類型得到空字符串,int類型得到0,程序不會報錯。
- 可以通過value, ok := map[key]獲知key/value是否存在。ok是bool型,如果ok是true,則該鍵值對存在,否則不存在。
package mainimport "fmt"func main() {countryMap := make(map[string]string)countryMap["China"] = "Beijing"countryMap["Japan"] = "Tokyo"countryMap["India"] = "New Delhi"countryMap["France"] = "Paris"countryMap["Italy"] = "Rome"//查看元素是否在map中存在value, ok := countryMap["England"]fmt.Printf("%q \n", value)fmt.Printf("%T , %v \n", ok, ok)if ok {fmt.Println("首都:", value)} else {fmt.Println("首都信息未檢索到!")}//或者if value, ok := countryMap["USA"]; ok {fmt.Println("首都:", value)} else {fmt.Println("首都信息未檢索到!")}
}
1-3 map集合刪除
-
delete(map, key) 函數(shù)用于刪除集合的某個元素,參數(shù)為map和其對應(yīng)的key。刪除函數(shù)不返回任何值。
-
Go語言沒有為map提供清空所有元素的函數(shù),清空map的唯一辦法是重新make一個新的map。不用擔心垃圾回收的效率,Go語言的垃圾回收比寫一個清空函數(shù)更高效。
package mainimport "fmt"func main() {//1、聲明并初始化一個mapmap1 := map[string]string{"element": "div","width": "100px","height": "200px","border": "solid","background": "none",}//2、根據(jù)key刪除map中的某個元素fmt.Println("刪除前:", map1)if _, ok := map1["background"]; ok {delete(map1, "background")}fmt.Println("刪除后:", map1)//3、清空map//map1 = map[string]string{}map1 = make(map[string]string)fmt.Println("清空后:", map1)
}
1-4 map是引用類型
- map與切片相似,都是引用類型。將一個map賦值給一個新的變量時,它們指向同一塊內(nèi)存(底層數(shù)據(jù)結(jié)構(gòu))。修改兩個變量的內(nèi)容都能夠引起它們所指向的數(shù)據(jù)發(fā)生變化。
package mainimport "fmt"func main() {personSalary := map[string]int{"Steven": 18000,"Daniel": 5000,"Josh": 20000,}fmt.Println("原始薪資:", personSalary)newPersonSalary := personSalarynewPersonSalary["Daniel"] = 8000fmt.Println("修改后newPersonSalary:", newPersonSalary)fmt.Println("personSalary受影響情況:", personSalary)
}
雖然就底層而言,所有的數(shù)據(jù)都是由比特組成,但計算機一般操作的是固定大小的數(shù),如整型、浮點型、布爾型、字符串、字符(byte、rune)等。進一步將這些數(shù)組織在一起,就可表達更多的對象。
Go語言提供了豐富的數(shù)據(jù)組織形式,這依賴于Go語言內(nèi)置的數(shù)據(jù)類型。這些內(nèi)置的數(shù)據(jù)類型,如函數(shù)與指針、數(shù)組、切片、map等,兼顧了硬件的特性和表達復雜數(shù)據(jù)結(jié)構(gòu)的便捷性。