Go map相關

雲崖先生發表於2020-10-01

map

   Go語言中的map是一種無序的,基於key-value的資料解構,在Go語言中map是引用型別,因此必須初始化後才能使用。

   以下示例將展示如何宣告一個map型別,以及如何簡單使用。

   需要注意的是mapcap可以進行自動擴容,但是我們應該在初始化map的時候就給好適當的容量以提高效能。

package main

import (
	"fmt"
)

func main() {
	// 初始化一個map,key為string型別,value為int型別,容量為10組
	var m = make(map[string]int,10)
	// 進行填充資料
	m["first"] = 110
	m["second"] = 120
	m["last"] = 119
	// 取出value
	fmt.Println(m["first"]) // 110
}

宣告填充

   在宣告map時我們就可以對其填充一些資料,這在很多程式語言中都是被允許的,Go語言中也不例外。

package main

import (
	"fmt"
)

func main() {
	// 注意,不可指定cap
    var userInfo = map[string]string{
		"userName":"雲崖先生",
		"userAge":"18",
		"userGender":"male",
	}
	fmt.Println(userInfo)
	// map[userAge:18 userGender:male userName:雲崖先生]
}

判斷key

   Go語言中有個判斷map中鍵是否存在的特殊寫法,格式如下:

value, ok := map[key]

   示例如下:

package main

import (
	"fmt"
)

func main() {
	// 注意,不可指定cap
    var userInfo = map[string]string{
		"userName":"雲崖先生",
		"userAge":"18",
		"userGender":"male",
	}
	value,ok := userInfo["userHobby"]
	if ok{
		fmt.Println(value)
	}else{
		fmt.Println("沒有該key")
	}

	fmt.Printf("%v \n",value) //  一堆空格
	fmt.Printf("%v \n",ok) // false
	
}

遍歷map

   遍歷map時應該使用range進行遍歷,另外由於map中的資料是無序的,所以遍歷的時候也是無序的。

package main

import (
	"fmt"
)

func main() {
	// 注意,不可指定cap
    var userInfo = map[string]string{
		"userName":"雲崖先生",
		"userAge":"18",
		"userGender":"male",
	}
	for key,value := range userInfo{
		fmt.Printf("%v-%v \n",key,value)
	}
}

   當只想遍歷key時,可不指定value

順序遍歷

   由於map是無序的,所以如果我們想使用順序遍歷,則需要將key全部提取到一個slice中,遍歷slice取出map中的value即可。

package main

import(
	"fmt"
	"sort"
)

func main() {
	m := map[string]string{
		"k-2": "第二個",
		"k-5": "第五個",
		"k-1": "第一個",
		"k-4": "第四個",
		"k-3": "第三個",
	}
	slice := make([]string,0,5) // 只能用切片,切片才能append
	for key := range(m){
		slice = append(slice,key)
	}
	sort.Strings(slice) // 排序
	for _,key := range(slice){
		fmt.Println(m[key])
	}
}

刪除元素

   使用內建函式delete()可刪除map中的鍵值對。

delete(map,key)

   示例演示:

package main

import (
	"fmt"
)

func main() {
	// 注意,不可指定cap
    var userInfo = map[string]string{
		"userName":"雲崖先生",
		"userAge":"18",
		"userGender":"male",
	}
	delete(userInfo,"userGender")
	fmt.Println(userInfo)
	// map[userAge:18 userName:雲崖先生]
}

切片的元素是map

   切片中的元素可以是map

package main

import (
	"fmt"
)

func main() {
	m := map[string]string{
		"k-2": "第二個",
		"k-5": "第五個",
		"k-1": "第一個",
		"k-4": "第四個",
		"k-3": "第三個",
	}
	slice := make([]map[string]string, 0, 1) // 該切片內部只能儲存map
	slice = append(slice, m)
	fmt.Println(slice[0]["k-1"])
	fmt.Println(slice[0]["k-2"])
}

map的value是切片

   一個切片也可以作為mapvalue

package main

import (
	"fmt"
)

func main() {
	// 該map的value必須是slice
	var sliceMap = make(map[string][]string, 3)
	var sliceValue = make([]string, 0, 3)
	sliceValue = append(sliceValue,"slice-1","slice-2","slice-3")
	sliceMap["first"] = sliceValue
	fmt.Println(sliceMap)
	// map[first:[slice-1 slice-2 slice-3]]
}

相關文章