Go語言學習、Map結構

前面我們學習了Go語言中的數組,切片類型。但是我們發現使用數組或切片存儲的數據量如果比較大,那麼通過下標來取出某個具體數據的時候,相對來說比較麻煩。

我們在數組或是切片中取值時,往往需要遍歷這個數組或切片。比較麻煩。

那麼有沒有一種數據結構,能夠幫我們快速的取出數據呢?那就Map結構,也就是字典結構。

Go語言中的結構是由鍵和值構成的,與其他語言類似。以鍵值對的形式存在。

某個鍵(key)都對應的一個值(value),如果要查詢某個值,直接根據對應的鍵就可以查詢出該值。

注意,這裏,鍵不能重複。必須唯一。

一、map的定義與初始化

package main

import "fmt"

func main() {
	//Map定義與使用
	//字典名 map[ keyType ] valueType
	var m map[int] string
	m = make(map[int] string, 1)
	// map [key] key是一個基本數據類型。
	// map 是自動擴容的。
	m[1] = "啦啦啦"
	m[2] = "哈哈哈"
	fmt.Println(m)
}

結果:

map[1:啦啦啦 2:哈哈哈]

這裏我們在創建的時候,創建了一個長度的map,但是你會發現,我們在給map中添加數據的時候,一樣可以添加進去。

這是因爲,map這種數據結構,在go語言中,長度 是自動擴容的,並且兩者始終保持相等。

這裏還要說一下,鍵的類型,必須是支持==和!=操作符的類型,切片、函數以及包含切片的結構類型不能作爲字典的鍵,使用這些類型會造成編譯錯誤。

Map中的數據,是無序存儲的。 

package main

import "fmt"

func main() {
	//Map定義與使用
	//字典名 map[ keyType ] valueType
	var m map[int] string
	m = make(map[int] string, 1)
	// map [key] key是一個基本數據類型。
	// map 是自動擴容的。
	m[1] = "啦啦啦"
	m[2] = "哈哈哈"
	m[3] = "哦哦哦"
	m[4] = "啪啪啪"
	fmt.Println(m)

	//map中的值
	for k, v := range m{
		fmt.Println(k,v)
	}
}

結果:

map[1:啦啦啦 2:哈哈哈 3:哦哦哦 4:啪啪啪]
1 啦啦啦
2 哈哈哈
3 哦哦哦
4 啪啪啪

 Map在定義時需要注意,key是唯一的。另外一種定義方式:

package main

import "fmt"

func main() {
	m:= map[string] int {"哈哈": 1, "啦啦": 2, "啪啪": 3}
	fmt.Println(m)
}

結果:

map[哈哈:1 啦啦:2 啪啪:3]

二、Map中的值:

map中的值,可以直接循環打印,上面我們已經演示過了。

還可以直接通過鍵輸出值:

package main

import "fmt"

func main() {
	m:= map[string] int {"哈哈": 1, "啦啦": 2, "啪啪": 3}
	fmt.Println(m["哈哈"])
}

結果:

1

如果在打印中,打印了沒有出現的值,那麼默認爲空。

判斷鍵值是否在map中,如果存在,則打印對應的值,如果不存在,就打印key值不存在

package main

import "fmt"

func main() {
	m:= map[string] int {"哈哈": 1000, "啦啦": 2000, "啪啪": 3000}
	//判斷
	v,ok := m["哈哈"]
	if ok{
		fmt.Println(v)
	}else {
		fmt.Println("key值不存在")
	}
}

輸出結果:

1000

三、刪除Map中的元素

 delete(map,key)

package main

import "fmt"

func main() {
	m:= map[int] string {1:"111", 2:"222", 3:"333", 4:"444"}
	//打印map m 的對應類型 複合類型
	fmt.Printf("%T \n", m)
	//刪除元素
	delete(m, 1)
	fmt.Println(m)
}

打印結果:

map[int]string 
map[2:222 3:333 4:444]

這裏注意一下,我們在刪除元素的時候,如果key不存在,也不會報錯。

delete(map,key),刪除操作,沒有返回值。刪除也不會影響map順序。因爲本身map就是無序的

四、Map作爲函數參數

 map作爲函數參數進行,傳遞,是地址傳遞,也叫引用傳遞

package main

import "fmt"

func map_add(m map[int]string){
	m[2] = "222"
}

func main() {
	m:=make(map[int]string,1)
	m[1] = "111"
	//map 作爲函數參數,是地址傳遞 (引用傳遞)
	map_add(m)
	fmt.Println(m)
}

結果:

map[1:111 2:222]

map可以在函數中添加數據,影響主調函數中實參的值

map只有長度值,沒有容量值,只能用len()求得長度,不能用cap()求容量。cap在切片中使用。

特殊用法:

m:=make(map[int][]int)

上述這種用法,是map定義key值爲int類型。value值爲切片。

m:=make(map[int][]struct)

上述這種用法,是map定義key值爲int類型。value值爲結構體類型。

發佈了65 篇原創文章 · 獲贊 50 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章