map使用make()建立,支持:=這種簡寫方式node
使用len()獲取元素個數docker
一、map[K]V 二、map[K1]map[K2]V 複合map,也就是說,值value也是map類型
//map 練習 package main import ( "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]) } }
//測試某個值是否在map裏呢? package main import "fmt" func main() { sparkClusterIdApp := map[string]string{"spark001":"marathon001","spark002":"marathon002"} clusterId001 := "spark003" _, ok := sparkClusterIdApp[clusterId001] if !ok { fmt.Println("clusterId: \t", clusterId001, "再也不容器裏") } clusterId002 := "spark001" if v,ok :=sparkClusterIdApp[clusterId002]; ok { fmt.Println("value:\t", v) } else { fmt.Println("value does not exist!") } }
測試結果: markdown
clusterId: spark003 再也不容器裏 value: marathon001 Process finished with exit code 0