map
Go
語言中的map
是一種無序的,基於key-value
的資料解構,在Go
語言中map
是引用型別,因此必須初始化後才能使用。
以下示例將展示如何宣告一個map
型別,以及如何簡單使用。
需要注意的是map
的cap
可以進行自動擴容,但是我們應該在初始化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是切片
一個切片也可以作為map
的value
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]]
}