什么是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类型