什么是map?
简单来讲
map是go中的一种内置类型,是一个key-value(键值对)数据
map是一种无序的键值对的集合,map最重要的一点是通过key来快速检索数据,key类似于索引指向数据的值
map是一种集合,我们可以通过向迭代数组和切片那样迭代它,不过,map是无序的,我们无法决定它的返回顺序,这是因为map是使用hash实现的,也是一种引用类型
使用map过程需要注意的事:
-
map是无序的,每次打印出来的map都是不一样的,不能使用index来访问,必须使用key来获取
-
map 的长度也是不固定的,与slice一样属于引用类型
-
内置的len函数一样可以对map使用,返回map中key的个数
-
map的key可以是所有可以比较的类型,如:布尔型,整数型,浮点型,复杂型,字符串型...
-
key不能重复
map的使用
1.直接定义的方式来定义一个map
var map1 map[int]string //map后的方括号中表示的是key值的类型,方括号之后表示的是数据值的类型
2.使用make()来创建map
var map2 = make(map[int]string) //语法格式:var mapname = make(map[key类型]值类型)
3.在定义的同时进行赋值
var map3 = map[string]int{"go":98,"python":88,"java":86}
4.注:如果不对map进行初始化,那么就会创建一个nil map,nil map不能用来存放键值对
因此在上面的例子中 map1是不能用来存放数据的,使用make进行创建的map就不是nil,可以使用
5.对map中数据操作
01.存取数据到map中
map2[1] = “hello”
map2[2] = “nice to meet you”
map2[3] = “okfine”
02.获取map中的数据
fmt.Println(map2) //输出结果:map[1:hello 2:nice to meet you 3:okfine]
fmt.Println(map2[1]) //输出结果:hello
fmt.Println(map[2]) //输出结果:nice to meet you
fmt.Println(map[100]) //输出结果:(空行)==>map中没有该key值则输出空(是string类型的默认值,即""),Println会换行
03.由上面的最后一个例子可知,在没有对应的key值访问得到的值会是值类型的默认值(零值),若我们刚好需要到一个值为空时,如何判断他是我们设置的还是该键值不存在呢?
此时我们可以使用 ok-idiom获取值,可知道key/value是否存在 ==> value,ok := map[key]
如: value, ok := map1[100] • if ok { //key值存在ok即为true,不存在则为false fmt.Println(value) } else { fmt.Println("key值不存在") //此行会执行 }
04.修改数据:语法格式同存储数据
05.删除数据
delete(map1,1) //格式:delete(map名,key值)
06.获得map长度
len(map1)
6.遍历map
使用 for range进行遍历
for key,val := range map1{
fnt.Println(key,val)
}
map是无序的,所以其输出的顺序不会按照任何顺序,那怎么做到有序排列呢?
以上是key值为int类型时的排序方式,若是key值为string类型,sort包下也有对应的Strings方法可以对string类型的数组或切片进行升序排序
###
注:map也是引用类型的数据类型,多个map指向同一个地址时改变该地址中的数据,所有指向个地址的map中数据都会改变。
go语言中的字符串string
在go语言中,字符串实质上是一个字节(uint8)的切片,属于一种基本数据类型,可以通过将其内容封装在""中来创建字符串。go中的字符串是Unicode兼容的,并且是UTF-8编码的
string的使用
1.定义
var str string = "helloworld"
var str = "hello"
str := "nice to meet you"
2.获取长度
len(str)//获取的是字节的个数,中文字符一般是占用三个字节
3.获取某个字节
fmt.Println(str[0])//获取str字符串中的第一个字节,得到的该字符的ascall编码值
fmt.Printf("%c\n",str[1])
4.字符串的遍历
for i=0;i<len(str);i++{
fmt.Printf("%c\t",str[i]);
}
for _,v := range str{
fmt.Prinf("%c\t",v);
}
5.字符串是字节的切片
slice := []byte{65,66,67,68,69}
str := string(slice) //可以直接将字节切片转化成字符串
fmt.Println(str) //输出:ABCDE
str := "abcde"
slice := []byte(str) //可以直接将字符串转化成字节切片
fmt.Println(slice) //输出:[97 98 99 100 101]
6.字符串不能修改
str := "hEllo"
str[1] = 'e' //报错
strings包下的常用函数
1.Contains(字符串,字符串常量):判断字符串中是否包含指定的内容
fmt.Println(strings.Contains(str,"abc")) // true/false
2.ContainsAny(字符串,字符串常量):判断字符串中是否包含指定内容中的任意字符
3.Count(字符串,字符串常量):判断指定内容再字符串中出现的次数
4.HasPrefix(字符串,prefix):判断字符串开头内容是否是prefix
HasSuffix(字符串,suffix):判断字符串结尾内容是否是suffix
5.Index(str,substr):得到substr在str中第一次出现的下标,不存在则-1
6.IndexAny(str,chars):返回chars中任一个字符在str中第一次出现的下标,如IndexAny("helloworld","abcde"),返回1,不存咋则返回-1
7.IndexLast(str,substr):得到substr在str中最后一次出现的位置
8.Join(切片,string):将指定切片中的内容拼接起来,中间以string内容分隔
9.Split(str,string):根据string的内容对str进行切割,得到一个切片
10.Repeat(str,count):返回重复count次的str
11.Replace(str,old,new,n):将str中的n个old字符替换为new字符,n为-1会替换所有
12.ToLower(str):将所有的大写字母改成小写
ToUpper(str):将所有的小写字母改成大写
13.截取子串:go语言中没有包装该用法的函数,因为go语言有很简便的截取子串的方式,跟截取切片的方法一样(实际上就是截取切片)
str[strat:end]-->substr:截取start到end位置的字符串,包含start位置不包含end位置
strconv包下的常用函数(字符串和基本类型之间的转换)
go语言的"+"号,在字符串中起连接作用,在数值中起相加作用,但同时有字符串和字符时无法使用,会报错,这时我们就需要进行类型转换,再进行我们需要的拼接或相加操作。
1.Atoi():字符串转整形 参数放括号,返回转类型后的值
2.Itoa():整形转字符串 参数放括号,返回转类型后的值
3.b,err := ParseBool(str):将字符串解析并转换成bool类型数据
4.f,err := ParseFloat():将字符串解析并转换成float类型数据
5.i,err := ParseInt(str,base,bitsize):将字符串解析并转换成int类型数据
base:字符串所使用的进制,如str为"100",base为2,最后结果即为4
bitsize:位数
6.u,err := ParseUint():将字符串解析并转换成uint类型数据
7.FormatBool():将bool类型的数据转为string类型
8.FormatInt(i,base):将int类型的数据转为string类型
9.FormatFloat():将float类型的数据转为string类型