7.6 字符串、数组和切片的应用

Kesa...大约 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 字符串和切片的内存结构

字符串在内存中实际上是双字结构:

  • 指向实际数据的指针
  • 字符串长度
image-20230504190917279
image-20230504190917279

7.6.4 修改字符串

Go 中的字符串是不可变的,需要将其转换成字节切片后进行修改。

07_6_string_slice.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 比较字节数组

07_6_bytes_compare.go

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来排序和搜索,详见sortopen in new window

7.6.7 append 常用操作

  1. 将切片 b 的元素追加到切片 a 之后:a = append(a, b...)

  2. 复制切片 a 的元素到新的切片 b 上:

    b = make([]T, len(a))
    copy(b, a)
    
  3. 删除位于索引 i 的元素:a = append(a[:i], a[i+1:]...)

  4. 切除切片 a 中从索引 ij 位置的元素:a = append(a[:i], a[j:]...)

  5. 为切片 a 扩展 j 个元素长度:a = append(a, make([]T, j)...)

  6. 在索引 i 的位置插入元素 xa = append(a[:i], append([]T{x}, a[i:]...)...)

  7. 在索引 i 的位置插入长度为 j 的新切片:a = append(a[:i], append(make([]T, j), a[i:]...)...)

  8. 在索引 i 的位置插入切片 b 的所有元素:a = append(a[:i], append(b, a[i:]...)...)

  9. 取出位于切片 a 最末尾的元素 xx, a = a[len(a)-1], a[:len(a)-1]

  10. 将元素 x 追加到切片 aa = append(a, x)

可以学习一下 Eleanor McHugh 编写的几个包:slicesopen in new windowchainopen in new windowlistsopen in new window

7.6.8 切片和垃圾回收

切片底层指向一个数组,只有在没有任何切片指向时,数组才会被释放。

若只需要一部分数据时,需要将其复制到新的切片中,以便释放原数组的资源。

上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2