標籤:map
map理論基礎知識
- 類似其他語言中的雜湊表或者字典,以key-value形式儲存資料
- key必須是支援== 或者 != 比較運算的類型,不可以是函數,map或者slice
- map尋找比線性搜尋快很多,但比使用索引訪問資料的類型慢100倍
map使用make()建立,支援:=這種簡寫方式
- make([keyType]valueType, cap), cap表示容量,可省略
- 超出容量時會自動擴容,但盡量提供一個合理的初始值
使用len()擷取元素個數
- 索引值對不存在時自動添加,使用delete()刪除某索引值對
- 使用for range 對map和slice進行迭代操作
迭代時,注意事項
//map 練習package mainimport ( "fmt" "sort")func main() { //============================方式一:=========================== //建立一個空的map //先聲明一個map類型 var nodeMap map[int]string //初始化nodeMap, 全部為空白 nodeMap = map[int]string{} fmt.Println(nodeMap) fmt.Println("-----------------------------------------------") //============================方式二:===========利用make================ var clusterMap map[int]string = make(map[int]string) fmt.Println(clusterMap) fmt.Println("-----------------------------------------------") //============================方式三:===========利用推斷功能================ operatorMap := make(map[int]string) fmt.Println(operatorMap) //============================方式四:===========建立時直接初始化================ //此種方式,不需要使用make operatorMap2 := map[int]string{3:"hello", 5:"world"} fmt.Println("===>:\t",operatorMap2) // ======初始化===== nodeMap[1] = "sparkNode" nodeMap[2] = "esNode" fmt.Println(nodeMap) //=======根據鍵 取出 元素 nodeName := nodeMap[2] fmt.Println(nodeName) //======刪除索引值對 delete(nodeMap, 1) //根據索引值對,進行刪除 fmt.Println(nodeMap) fmt.Println("-----------------------------------------------") //--------------複雜map的操作------------------- //聲明一個map類型 var clusterAppTaskId map[string]map[string]string //初始化此map類型 clusterAppTaskId = make(map[string]map[string]string) taskId, ok := clusterAppTaskId["spark-beijing"]["/spark-beijing/app-uewqr"] if !ok { //每一層級的map都有進行初始化,編譯時間是找不到的,只有運行時,才能發現 clusterAppTaskId["spark-beijing"] = make(map[string]string) } clusterAppTaskId["spark-beijing"]["/spark-beijing/app-uewqr"] = "app-ewr-spark-taskid-001" taskId, ok = clusterAppTaskId["spark-beijing"]["/spark-beijing/app-uewqr"] fmt.Println(taskId, ok) fmt.Println("-----------------------------------------------") //--------------迭代操作------------------- //for i, v := range slice { // //} //i, 表示下標,v表示對應的值,是拷貝的值 //要特別注意,對v的任何修改,都不影響原值, // map類型也是,不會影響原值的 //例如,下面的例子,就是對v的操作後,不會對sm產生影響的 //因此,不建議使用這種方式 sm := make([]map[int]string, 5) for _, v := range sm { v = make(map[int]string) v[1] = "ok" fmt.Println(v) } fmt.Println(sm) fmt.Println("-----------------------------------------------") //下面的修改,原值 for i := range sm { sm[i] = make(map[int]string) sm[i][2] = "spark" fmt.Println(sm[i]) } fmt.Println(sm) fmt.Println("-----------------------------------------------") //--------------------------------- //map是無序的,如何按照鍵從小到大擷取map中的值 //需要產生一個切片,來儲存map的鍵 //將鍵按照從小到大排序,然後,再根據鍵去取值 marathonApp := map[int]string{1: "spark", 3: "es", 8: "ftp", 7:"hadoop", 4: "k8s", 2: "docker"} len := len(marathonApp) //產生一個切片,來儲存鍵 kSlice := make([]int, len) // 聲明一個計數器,用於初始化切片時使用 var i int = 0 for k, _ := range marathonApp { kSlice[i] = k i++ } fmt.Println("鍵排序前:\t", kSlice) //切片是引用傳遞,因此,下面排序後,不需要傳回值進行接收 sort.Ints(kSlice) fmt.Println("鍵排序後:\t", kSlice) fmt.Println("根據鍵按照從小到大,依次取出對應的值") //下面,開始迭代marathonApp,就可以按照鍵的從小到大,依次取出值了 for _, v := range kSlice { //這裡一定要注意,是用值,而不是 kSlice的下標 fmt.Println(marathonApp[v]) }} fmt.Println("-----------------------------------------------") //------------------如何將map類型的鍵與值對換呢--------------- kafkaClusterIdNameMap := map[int]string{1: "kafka-beijing", 2: "kafka-sjz", 4: "kafka-shanghai", 5: "kafka-tianjin", 3: "kafka-yizhuang"} kafkaNameClusterIdMap := make(map[string]int) for k, v := range kafkaClusterIdNameMap { kafkaNameClusterIdMap[v] = k } fmt.Println("kafkaClusterIdNameMap:\t", kafkaClusterIdNameMap) fmt.Println("kafkaNameClusterIdMap:\t", kafkaNameClusterIdMap)
Go語言之map練習