提供了很多与strings包类似的功能。因为字符串是只读的,逐步构建字符串会导致很多分配和复制,这种情况下,使用bytes.Buffer类型将会更有效。
strconv
提供了布尔类型、整数、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换。
unicode
提供了IsDigit、IsLetter、IsUpper和IsLower等功能,用于给字符分类。
strings包常用的6个函数,功能参考Go中文帮助文档
byte包常用的的6个函数,功能与strings类似。
它们之间的唯一区别就是字符串类型的参数替换成了字节slice类型的参数。
4.3 映射映射是一个无序的键值对集合,其中所有的键都是不同的,然后通过给定的键可以在常数时间复杂度内检索、更新或删除对应的值。在Go语言中,一个map就是一个哈希表的引用,映射中所有的键都有相同的类型,所有的值也有着相同的类型,但是键和值之间可以是不同的数据类型。
1 声明映射
声明的一般格式为:
var 映射名称 map[键]值
只是声明一个map,它的初始值是nil,也就是没有引用任何哈希表。所以不能向一个nil值的map存入元素。
var ages map[string]int
fmt.Println(age == nil)//”true”
fmt.Println(len(ages)== 0)//”true”
2 创建映射
内置的make函数可以创建一个map,创建后可以存入元素。
myMap1 := make(map[string]int) //创建一个map
myMap2 := make(map[string]int, 100) //创建一个map,初始储存能力为100
myMap3 := map[string]int{
"str1": 10, "str2": 20, "str3": 30} //直接创建,并初始化
fmt.Println(myMap1, len(myMap1))
fmt.Println(myMap2, len(myMap2))
fmt.Println(myMap3, len(myMap3))
打印结果:
map[] 0
map[] 0
map[str3:30 str1:10 str2:20] 3
3 元素的赋值和删除
元素可以直接赋值,内置的delete函数用于删除元素,删除一个不存在的元素,不会造成错误。
myMap3 := map[string]int{"str1": 10, "str2": 20, "str3": 30}
fmt.Println(myMap3, len(myMap3))
myMap3["str5"] = 50
fmt.Println(myMap3, len(myMap3))
delete(myMap3, "str")
delete(myMap3, "str3")
fmt.Println(myMap3, len(myMap3))
打印结果:
map[str3:30 str1:10 str2:20] 3
map[str5:50 str1:10 str2:20 str3:30] 4
map[str1:10 str2:20 str5:50] 3
4 查找元素
有时候可能需要知道对应的元素是否在map中,例如,如果元素类型是一个布尔类型,你可能需要区分一个零值的元素,和因为元素不存在而返回的零值,可以像下面这样使用:
v,ok:=map[key]
if !ok{/*在map中不存在key为键的元素*/}
//结合起来使用
if v,ok:=map[key];!ok{/* */ }
在这种场景下,map下标语法将产生两个值;第二个值是一个布尔类型,用于表示元素是否存在。布尔变量一般命名为ok。示例如下:
myMap3 := map[string]int{"str1": 10, "str2": 20, "str3": 30}
if v, ok := myMap3["str2"]; ok {
fmt.Println(v)
}
5 遍历映射