map的创建
func main() {
//创建 map
studens := map[string]string{
"name": "张三",
"age": "18",
"sex": "男",
} //直接创建有值的map
var m2 map[string]int //map == nil
m3 := make(map[string]string) //map == empty map
}
可以看出,在go中可以创建map的方式还是很多的,就算是不初始化,也可以赋值
map key的类型
在map的key可以使用那些类型?
- 首先map是使用哈希表的,必须可以比较相等
- 除了slice,map,function 的内建类型其他的都可以作为key
- struct 类型不包含以上字段的也可以作为key(struct 类型后面会专门写道)
map取值
//获取key元素
name := studens["name"]
fmt.Println(name) //"张三"
取出不存在的元素呢?
//获取不存在元素
idCard := studens["idCard"]
fmt.Println(idCard) //打印空 ""所以我们怎么判断,key是否取到了呢?
key是否取到了呢?
idCard,ok := studens["idCard"] //其实 获取map可以返回两个参数,第二个就是bool类型,false表示不存在
fmt.Println(idCard,ok) // 打印 "" false
if idCard,ok := studens["idCard"];ok {
fmt.Println(idCard)
}else {
fmt.Println("key idCard not exist")
}// key idCard not exist
map遍历
//遍历 map
fmt.Println("----------key value一起遍历------n")
//key value一起遍历
for k, v := range studens {
fmt.Println(k,v)
}
fmt.Println("---------只遍历key-------n")
//只遍历key
for k := range studens {
fmt.Println(k)
}
fmt.Println("---------只遍历 value-------n")
//只遍历 value
for _, v := range studens {
fmt.Println(v)
}
遍历就很简单了,可以使用range关键字
map删除
直接使用delete函数删除
//删除存在的键
delete(studens, "age")
fmt.Println("delete age after:",studens) //delete age after: map[sex:男 name:张三]
//删除不存的键
delete(studens,"idCard")
fmt.Println("delete ont exist key after:",studens) //delete ont exist key after: map[name:张三 sex:男]
map小测试
打印出字符串中最长不重复字符长度
举例:
"asdjkh" -> "asdjkh" 6个字符
"aaaa" -> "a" 1个字符
"abccba" -> "abc" 3个字符
我们先来整理思路,其实这个题使用map来做就会非常的简单,如图:
实现代码:
package main
import "fmt"
/**
查找到一个字符串中
最长不重复字符串
例如:
asdasdss -> asd
*/
func findMaxNoRepeatString(s string) int {
start := 0
keysIndex := make(map[byte]int)
lenth := 0
for i, v := range []byte(s) { //这里将字符串转为 byte数组的原因,string遍历每一个元素是int32类型
lastIndex, ok := keysIndex[v]
if ok && lastIndex >= start {
start = lastIndex + 1
} else {
lenth = i - start + 1
}
keysIndex[v] = i
}
return lenth
}
func main() {
fmt.Println(findMaxNoRepeatString("abc")) //3
fmt.Println(findMaxNoRepeatString("abccba")) //3
fmt.Println(findMaxNoRepeatString("aaaaa")) //1
fmt.Println(findMaxNoRepeatString("")) //0
fmt.Println(findMaxNoRepeatString("asdfghjk")) //8
}
思路是对的,也出现结果了,但是其实还是有bug的.
fmt.Println(findMaxNoRepeatString("我是小智")) //8
fmt.Println(findMaxNoRepeatString("小智智小")) //6
发现这个 8 和 6 是什么鬼?想到搞清楚这个问题,就需要了解,go的字符串编码,go中是使用utf编码(可变长度编码). 下章专门讲解go的string编码.
作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star