Go学习——9.Map

Map

1.Map的定义

  1. 使用make定义

m := make(map[string]string)
特别注意:默认值不是nil,是empty map,但是在运算中,nil和empty map是可以互用的

  m := make(map[string]string)
  fmt.Println(m) // map[]
  1. 非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的注意点

  1. map使用哈希表,必须可以比较相等
  2. 除了slice, map, function的内建类型之外的都可以作为key
  3. 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
}

注意点

  1. 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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值