摘要: 一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于Go语言的源代码要求是UTF8编码,导致Go源代码中出现的字符串面值常量一般也是UTF 阅读全文
posted @ 2020-12-24 16:57 hubb 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是数组类型的组成部分。因为数组的长度是数组类型的一个部分,不同长度或不同类型的数据组成的数组都是不同的类型,因此在Go语言中很少直接使用数组(不同长度的数组因为类型不同无法直接赋值)。和数组对应的类型是切片,切 阅读全文
posted @ 2020-12-24 16:56 hubb 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 我们先看看切片的结构定义,reflect.SliceHeader: type SliceHeader struct { Data uintptr Len int Cap int } 可以看出切片的开头部分和Go字符串是一样的,但是切片多了一个Cap成员表示切片指向的内存空间的最大容量(对应元素的个数 阅读全文
posted @ 2020-12-24 16:53 hubb 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 避免切片内存泄漏 如前面所说,切片操作并不会复制底层的数据。底层的数组会被保存在内存中,直到它不再被引用。但是有时候可能会因为一个小的内存引用而导致底层整个数组处于被使用的状态,这会延迟自动内存回收器对底层数组的回收。 例如,FindPhoneNumber函数加载整个文件到内存,然后搜索第一个出现的 阅读全文
posted @ 2020-12-24 16:50 hubb 阅读(2438) 评论(0) 推荐(0) 编辑
摘要: 切片内存技巧 在本节开头的数组部分我们提到过有类似[0]int的空数组,空数组一般很少用到。但是对于切片来说,len为0但是cap容量不为0的切片则是非常有用的特性。当然,如果len和cap都为0的话,则变成一个真正的空切片,虽然它并不是一个nil值的切片。在判断一个切片是否为空时,一般通过len获 阅读全文
posted @ 2020-12-24 16:49 hubb 阅读(283) 评论(0) 推荐(0) 编辑