Go语言Map(集合)
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
定义 Map
可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对
Map实例
package main
import "fmt"
func main() {
m := map[string]string{
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
m2 := make(map[string]int) // m2==empty map
var m3 map[string] int // m3 == nil
fmt.Println(m, m2, m3)
fmt.Println("Traversing map")
for k, v := range m{
fmt.Println(k, v)
}
for k := range m{
fmt.Println(k)
}
for _, v := range m{
fmt.Println(v)
}
fmt.Println("Getting values")
couserName, ok := m["course"]
fmt.Println(couserName, ok)
// 不存在的key,会拿到一个空值
if couserName1, ok:= m["corse"]; ok{
fmt.Println(couserName1)
}else{
fmt.Println("key does not exist")
}
fmt.Println("Deleting values")
if name, ok := m["name"]; ok{
fmt.Println(name,ok)
delete(m, "name")
}
name, ok := m["name"]
fmt.Println(name,ok)
}
运行结果
map[course:golang name:ccmouse quality:notbad site:imooc] map[] map[]
Traversing map
course golang
site imooc
quality notbad
name ccmouse
name
course
site
quality
ccmouse
golang
imooc
notbad
Getting values
golang true
key does not exist
Deleting values
ccmouse true
false
总结
- Map的操作
- 创建:
make(map[string]int)
- 获取元素:
m[key]
- key不存在时,获取Value类型的初始值
- 用
value, ok := m[key]
来判断是否存在key
- 创建:
- Map的遍历
- 使用
range
遍历key
, 或者遍历key,value
- 不保证遍历顺序,如需顺序,需手动对
key
排序 - 使用
len
获取元素个数
- 使用
- Map的key
- Map使用哈希表,必须可以比较相等
- 除了
slice
、map
、function
的内建类型都可以作为key
Struct
类型不包含上述字段,也可以作为key
寻找最长不含有重复字符的子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
package main
import "fmt"
func lengthOfNonRepeatingSubStr(s string) int {
last0ccurred := make(map[rune]int)
start := 0
maxLength := 0
for i, ch := range []rune(s){
if lastI, ok := last0ccurred[ch]; ok && lastI >= start{
start = lastI + 1
}
if i - start + 1 > maxLength{
maxLength = i - start + 1
}
last0ccurred[ch] = i
}
return maxLength
}
func main() {
fmt.Println(lengthOfNonRepeatingSubStr("abcabcbb"))
fmt.Println(lengthOfNonRepeatingSubStr("bbbbb"))
fmt.Println(lengthOfNonRepeatingSubStr("pwwkew"))
fmt.Println(lengthOfNonRepeatingSubStr(""))
fmt.Println(lengthOfNonRepeatingSubStr("b"))
fmt.Println(lengthOfNonRepeatingSubStr("abcdef"))
fmt.Println(lengthOfNonRepeatingSubStr("这里是慕课网"))
fmt.Println(lengthOfNonRepeatingSubStr("一二三二一"))
}
运行结果
3
1
3
0
1
6
6
3
对于每一个字母x
lastOccurred[x]
不存在,或者<start → 无需操作lastOccurred[x]>=start
→更新start- 更新
lastOccurred[x]
,更新maxlength
字符串
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
// UTF-8
s := "Yes我爱慕课网!"
fmt.Println(s)
// 19 字节数
fmt.Println(len(s))
// Yes我爱慕课网!
fmt.Printf("%s\n", []byte(s))
// 596573E68891E788B1E68595E8AFBEE7BD9121
fmt.Printf("%X\n", []byte(s))
for _, b := range []byte(s){
fmt.Printf("%X ", b)
}
fmt.Println()
for i, ch := range s{ // ch is a rune
fmt.Printf("(%d %X)", i, ch)
}
fmt.Println()
// utf8.RuneCountInString获得字符串数量
fmt.Println("Rune count:", utf8.RuneCountInString(s))
// 获得所有的字节
bytes := []byte(s)
for len(bytes) > 0{
ch, size := utf8.DecodeRune(bytes)
bytes = bytes[size:]
fmt.Printf("%c ", ch)
}
fmt.Println()
for i, ch := range []rune(s){
fmt.Printf("(%d %c)", i, ch)
}
fmt.Println()
}
运行结果
Yes我爱慕课网!
19
Yes我爱慕课网!
596573E68891E788B1E68595E8AFBEE7BD9121
59 65 73 E6 88 91 E7 88 B1 E6 85 95 E8 AF BE E7 BD 91 21
(0 59)(1 65)(2 73)(3 6211)(6 7231)(9 6155)(12 8BFE)(15 7F51)(18 21)
Rune count: 9
Y e s 我 爱 慕 课 网 !
(0 Y)(1 e)(2 s)(3 我)(4 爱)(5 慕)(6 课)(7 网)(8 !)
Go语言中的字符串的常见操作
strings.HasPrefix(s string, prefix string)
返回值类型:bool
:判断字符串s是否以prefix开头strings.HasSuffix(s string, suffix string)
返回值类型:bool
:判断字符串s是否以suffix结尾。strings.Index(s string, str string)
返回值类型:int
:判断str在s中首次出现的位置,如果没有出现,则返回-1strings.LastIndex(s string, str string)
返回值类型int
:判断str在s中最后出现的位置,如果没有出现,则返回-1strings.Replace(str string, old string, new string, n int)
:字符串替换strings.Count(str string, substr string)
返回值类型:int
:字符串计数strings.Repeat(str string, count int)
返回值类型:string
:重复count次strstrings.ToLower(str string)
返回值类型:string
:转为小写strings.ToUpper(str string)
返回值类型:string
:转为大写strings.TrimSpace(str string)
:去掉字符串首尾空白字符strings.Trim(str string, cut string)
:去掉字符串首尾cut字符strings.TrimLeft(str string, cut string)
:去掉字符串首cut字符strings.TrimRight(str string, cut string)
:去掉字符串首cut字符strings.Field(str string)
:返回str空格分隔的所有子串的slicestrings.Split(str string, split string)
返回值类型:[]string
:返回str split分隔的所有子串的slicestrings.Join(s1 []string, sep string)
:用sep把s1中的所有元素链接起来strings.Itoa(i int)
:把一个整数i转成字符串strings.Atoi(str string)(int, error)
:把一个字符串转成整数