Map
1.Map的定义
- 使用make定义
m := make(map[string]string)
特别注意:默认值不是nil,是empty map,但是在运算中,nil和empty map是可以互用的
m := make(map[string]string)
fmt.Println(m) // map[]
- 非make定义
- 只定义,不赋值(也就是赋默认值)
var m map[string]string
特别注意:默认值是nil,不是empty map,但是在运算中,nil和empty map是可以互用的
var m map[string]string
fmt.Println(m) // map[]
- 定义且赋值:
m := map[string]string{
“name”: “yuhua”,
“age”: “18”,
}
- 普通map格式:
map[K]V
m := map[string]string {
"name": "yuhua",
"age": "18",
}
- 复合map
map[K1]map[K2]V
m := map[string]map[int]bool {
"a": {
1: true,
},
}
fmt.Println(m) // map[a:map[1:true]]
2.Map的遍历
for i,v := range m {
fmt.Println(i, v)
}
for i := range m {
fmt.Println(i)
}
for _,v := range m {
fmt.Println(v)
}
特别注意: map是hashMap,key是无序的
3.Map的取值
v,ok = m[key]
- 注意点:
- 如果key不存在,则获取的是当前key类型的零值
- ok表示这个key是否存在
- 问:为什么需要ok,当v为零值不就代表key不存在吗?
- 因为有可能key存在,但是这个key对应的value的值就是零值
4.Map的赋值
m[key] = value
- 普通map的赋值
m := map[string]int{
"age": 18,
}
fmt.Println(m["age"]) // 18
- 复合map的赋值
- ==特别注意:==赋值的时候,只能赋值跟原先类型一样的,并且需要写声明
m := map[string]map[int]bool {
"a": {
1: true,
},
}
m["a"] = map[int]bool{// 这里必须写map[int]bool,不能不写,也不能写成map[int]string,因为与最开始定义的时候不符了,这是不允许的
2: false,
}
fmt.Println(m)
- map需要初始化后才可以赋值 -> 看文末的注意点
5.Map的删除
delete(m, key)
- 无返回值,所以该语句不能当做值来使用,比如fmt.Println(delete(m, key))是不允许的
m := map[string]int{
"age": 18,
}
delete(m, "age")
fmt.Println(m) // map[]
6.Map的注意点
- map使用哈希表,必须可以比较相等
- 除了slice, map, function的内建类型之外的都可以作为key
- Struct类型不包含上述字段,也可以作为key
7. Map的应用举例
寻找最长不含有重复字符的子串 [leetcode习题]
比如:
abcabcbb -> abc
bbbbb -> b
pwwkew -> wke
-
思路:
对于每一个字母x- lastOccurred[x]不存在,或者小于start,则无需操作
- lastOccurred[x] >= start,则更新start
- 更新lastOccurred[x],更新maxLength
-
代码:
func lengthOfNoRepeatingSubStr(s string) int {
lastOccured := make(map[rune]int) // 记录当前字母最后出现的位置
start := 0
maxLength := 0
for i, ch := range []rune(s) {
if lastI, ok := lastOccured[ch]; ok && lastI >= start {
start = lastI + 1
}
if i - start + 1 > maxLength {
maxLength = i - start + 1
}
lastOccured[ch] = i
}
return maxLength
}
func main() {
fmt.Println(lengthOfNoRepeatingSubStr("abcabcbb")) // 3
fmt.Println(lengthOfNoRepeatingSubStr("bbbbb")) // 1
fmt.Println(lengthOfNoRepeatingSubStr("pwwkew")) // 3
fmt.Println(lengthOfNoRepeatingSubStr("")) // 0
fmt.Println(lengthOfNoRepeatingSubStr("b")) // 1
fmt.Println(lengthOfNoRepeatingSubStr("abcdef")) // 6
fmt.Println(lengthOfNoRepeatingSubStr("啊飒飒的地方是")) // 5
fmt.Println(lengthOfNoRepeatingSubStr("啊飒的地方是")) // 6
fmt.Println(lengthOfNoRepeatingSubStr("一二三二一")) // 3
}
注意点
- map需要初始化后才可以赋值
- 正确示例:
package main
import (
"fmt"
)
func main() {
type m map[string]string
mVal := m{"a": "1"}
fmt.Println(mVal)
}
- 错误示例:
package main
import (
"fmt"
)
func main() {
var m map[string]string // 当然这边是var,上面是type,type标识类型,但不管是var还是type,map都需要赋初值
m["a"] = "1"
fmt.Println(m) // 会报错panic: assignment to entry in nil map
}