7.6 字符串、数组和切片的应用
...大约 2 分钟
7.6 字符串、数组和切片的应用
7.6.1 从字符串生成字节切片
类型转换:
byteslice := []byte(str)copy():copy(dst []byte, src string)
7.6.2 获取字符串的一部分
substr := str[start: end]
7.6.3 字符串和切片的内存结构
字符串在内存中实际上是双字结构:
- 指向实际数据的指针
 - 字符串长度
 

7.6.4 修改字符串
Go 中的字符串是不可变的,需要将其转换成字节切片后进行修改。
func strsli() {
	str := "HELLO"
	fmt.Println("str: ", str)
	sli := str[:5]
	// cannot change string
	// sli[0] = 'T'
	fmt.Println(sli)
	// convert to []byte
	sb := []byte(str)
	sb[0] = 'T'
	fmt.Println(string(sb))
}
str:  HELLO
HELLO
TELLO
7.6.5 比较字节数组
func compare(a, b []byte) int {
	la, lb := len(a), len(b)
	for i := 0; i < la && i < lb; i++ {
		switch {
		case a[i] < b[i]:
			return -1
		case a[i] > b[i]:
			return 1
		}
	}
	switch {
	case la < lb:
		return -1
	case la > lb:
		return 1
	}
	return 0
}
7.6.6 搜索及排序切片数组
使用标准库sort来排序和搜索,详见sort
7.6.7 append 常用操作
将切片
b的元素追加到切片a之后:a = append(a, b...)复制切片
a的元素到新的切片b上:b = make([]T, len(a)) copy(b, a)删除位于索引
i的元素:a = append(a[:i], a[i+1:]...)切除切片
a中从索引i至j位置的元素:a = append(a[:i], a[j:]...)为切片
a扩展j个元素长度:a = append(a, make([]T, j)...)在索引
i的位置插入元素x:a = append(a[:i], append([]T{x}, a[i:]...)...)在索引
i的位置插入长度为j的新切片:a = append(a[:i], append(make([]T, j), a[i:]...)...)在索引
i的位置插入切片b的所有元素:a = append(a[:i], append(b, a[i:]...)...)取出位于切片
a最末尾的元素x:x, a = a[len(a)-1], a[:len(a)-1]将元素
x追加到切片a:a = append(a, x)
可以学习一下 Eleanor McHugh 编写的几个包:slices、chain 和 lists
7.6.8 切片和垃圾回收
切片底层指向一个数组,只有在没有任何切片指向时,数组才会被释放。
若只需要一部分数据时,需要将其复制到新的切片中,以便释放原数组的资源。
 Powered by  Waline  v2.15.2
