1. 程式人生 > 實用技巧 >Go語言學習之路-8-map

Go語言學習之路-8-map

目錄

為什麼會有map

array和slice優點

  • 可以儲存相同型別的的資料比如: s1 := []int{1,1,1,1,1,1}
  • 在知道下標的情況下訪問資料速度賊快: s2 := []string{"v0", "v1", "v2"} 訪問: s2[1]

缺點

  • 如果想判斷某個值是否存在或者不知道資料的下標怎麼辦?一個一個找效率就不高了

map

它是一個: key: value的集合例如: map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}

他可以通過key去直接訪問某個值,效率也很高,也可以通過key判斷是否存不像array或者slice下標沒啥特殊意義

map定義

標準定義宣告

func main() {
	// map[KeyType]ValueType
	// KeyType:表示鍵的型別
	// ValueType:表示鍵對應的值的型別
	// map是引用型別需要使用make初始化: make(map[KeyType]ValueType, cap)
	// 其中cap表示map的容量,該引數雖然不是必須的,但是我們應該在初始化map的時候就為其指定一個合適的容量
	m1 := make(map[int]int, 10)
}

注意事項

  • key不能重複
  • 無序的(值不變但是,不像array和slice的順序不變永遠下標都是順序的,每次輸出值得順序可能是不相同的)

map增加元素

func main() {
	m1 := map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}
	m1["義大利"] = "Italy"
	fmt.Printf("%v", m1)
}

map判斷元素是否存在

func main() {
	m1 := map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}

	// 直接取值會返回兩個值
	// 第一個值是: key的value, 第二個值: 如果key存在返回true否則返回false
	value, isTrue := m1["義大利"]

	fmt.Printf("%v,%v,\n", value, isTrue)

map刪除元素通過delete

func main() {
	m1 := map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}
	// delete(map, key)
	delete(m1, "美國")
       // 如果要刪除的key不存在什麼都不做
	fmt.Printf("%v\n", m1)

map修改元素

func main() {
	m1 := map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}

	m1["美國"] = "USA"
	fmt.Printf("%v\n", m1)
}

map查詢元素

func main() {
	m1 := map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}

	// 直接取值會返回兩個值
	// 第一個值是: key的value, 第二個值: 如果key存在返回true否則返回false
	value, isTrue := m1["義大利"]
	fmt.Printf("%v,%v,\n", value, isTrue)

	if isTrue {
		fmt.Printf("義大利已經存在了")
	} else {
		m1["義大利"] = "Italy"
	}
}

map元素的迴圈

func main() {
	m1 := map[string]string{"中國": "China", "英國": "Britain", "美國": "America"}

	// for range
	for key, value := range m1 {
		fmt.Printf("key: %v, value: %v\n", key, value)
	}
}

map元素的巢狀

func main() {
	// 列表包含map
	smap1 := []map[string]string{{"name": "eson", "addr": "hebei"}, {"name": "eric", "addr": "xian"}}
	smap1 = append(smap1, map[string]string{"name": "doudou", "addr": "beijing"})
	fmt.Printf("%v\n", smap1)

	// map包含列表
	maps1 := map[string][]string{"hebei": {"邯鄲市", "保定市"}, "henan": {"新鄭市", "林州市"}}
	maps1["shanxi"] = []string{"太原市", "長治市"}
	fmt.Printf("%v\n", maps1)

	// map包含map
	mapm1 := map[string]map[string]string{"eson": {"age": "18", "home": "hebei"}}
	mapm1["erice"] = map[string]string{"age": "20", "home": "beijing"}
	fmt.Printf("%v\n", mapm1)
}