1.說明
1)類似其他語言中的哈希表或者字典,以key-value形式存儲數據
2)key必須是支持==或!=比較運算的類型,不可以是函數、map或slice
3)map查找比線性搜索快很多,但比使用所有房屋數據的類型慢100倍
4)map使用make()創建,支持:=這種簡寫方式
5)map使用哈希表,必須可以比較相等
6)除了slice,map,function的內建類型都可以錯誤key
7)Struct類型不包含上述字段,也可以作爲key
2.操作
1)make([KeyType]value,cap),cap表示容量,可省略
2)超出容量時會自動擴容,但儘量提供一個合理的初始值
3)使用len()獲取元素個數
4)獲取元素:m[k]
5)key不存在時,獲得value類型的初始值(零值)
6)用value, ok := m[key]來判斷是否存在key
7)用delete刪除一個key
8)用range遍歷key,或者遍歷key,value對
9)不保證遍歷順序,如需順序,需要手動對key排序
10)使用len獲取元素個數
注意:
1)鍵值對不存在時自動添加,使用delete()刪除某鍵值對
2)使用for range對map和slice進行迭代操作
實例:
package main
import (
"fmt"
)
func main() {
m1 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e",
6: "f", 7: "g", 8: "h", 9: "i", 0: "j"}
fmt.Println("m1", m1)
m2 := make(map[string]int)
for i, v := range m1 {
m2[v] = i
}
fmt.Println("m2", m2)
}
輸出:
API server listening at: 127.0.0.1:47449
m1 map[2:b 1:a 3:c 4:d 5:e 6:f 7:g 8:h 9:i 0:j]
m2 map[a:1 c:3 d:4 f:6 g:7 j:0 b:2 h:8 e:5 i:9]
實例二
package main
import "fmt"
func main() {
m := map[string]string{
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
fmt.Println(m)
//定義一個空map
m2 := make(map[string]int) //m2 == empty map
var m3 map[string]int // m3 == nil
fmt.Println(m2, m3)
//map遍歷
for k, v := range m {
fmt.Println(k, v)
}
}
輸出:
API server listening at: 127.0.0.1:45987
map[name:ccmouse course:golang site:imooc quality:notbad]
map[] map[]
quality notbad
name ccmouse
course golang
site imooc
上述對m的輸出前後順序不一樣,這是因爲map在內存中是無序的
3.獲取變量
package main
import "fmt"
func main() {
m := map[string]string{
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
courseName := m["course"]
fmt.Println(courseName)
cName := m["cour"]
fmt.Println(cName)
fmt.Println("end")
}
輸出:
API server listening at: 127.0.0.1:37028
golang
end
上述代碼尤其注意k值拼寫錯誤並不會報錯,只是輸出爲空,這是因爲零值,那麼如何判斷K值是否存在呢,看下面代碼,獲取時候獲取一個狀態就好了
package main
import "fmt"
func main() {
m := map[string]string{
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
if courseName, ok := m["course"]; ok {
fmt.Println(courseName)
} else {
fmt.Println("course key does not exit")
}
if cName, ok := m["cour"]; ok {
fmt.Println(cName)
} else {
fmt.Println("cour key does not exit")
}
}
輸出:
API server listening at: 127.0.0.1:28373
golang
cour key does not exit
可以看出course存在直接輸出,cour不存在則報錯
4.刪除
package main
import "fmt"
func main() {
m := map[string]string{
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
fmt.Println(m)
delete(m, "name")
fmt.Println(m)
}
輸出:
API server listening at: 127.0.0.1:43307
map[name:ccmouse course:golang site:imooc quality:notbad]
map[course:golang site:imooc quality:notbad]
前後輸出對比發現name消失
綜合實例:
1.尋找最長不含有重複字符串的子串
題目來自:https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
題目描述如下圖:
例子:
abcabcbb->abc //最長的就是abc
bbbbb->b //最長爲b
pwwkew->pwke //最長爲pwke
算法描述:
對於每一個字母x
1)lastOccurred[x](字母x在字符串中最後出現的位置)不存在,或者<start(起始位置)->無需操作
2)lastOccurred[x] >= start ->更新start
3) 更新lastOccurred[x],更新maxLength
package main
import "fmt"
func getStringLength(s string) int {
lastOccurred := make(map[byte]int)
start := 0//這就相當於一個遊標,始終記錄的時當前字符串的遍歷位置
maxLength := 0//記錄的是已經查找過的不重複的字符串子串的長度
for i, ch := range []byte(s) {
lastI, ok := lastOccurred[ch]
if ok && lastI >= start {
start = lastI + 1
}
if i-start+1 > maxLength {
maxLength = i - start + 1
}
lastOccurred[ch] = i
}
return maxLength
}
func main() {
fmt.Println(getStringLength("abcabcbb"))
fmt.Println(getStringLength("bbbbb"))
fmt.Println(getStringLength("pwwkew"))
}
輸出:
API server listening at: 127.0.0.1:36778
3
1
3