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