1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00
This commit is contained in:
TomCao 2018-03-02 14:33:05 +08:00
parent df6fe0b5b3
commit e41820109f

View File

@ -334,9 +334,9 @@ func str2runes(s []byte) []rune {
func runes2string(s []int32) string {
var p []byte
buf := make([]byte, 3)
for _, r := range {
for _, r := range s {
n := utf8.EncodeRune(buf, r)
p = append(p, buf[:n])
p = append(p, buf[:n]...)
}
return string(p)
}
@ -378,7 +378,7 @@ var (
)
```
和数组一样,内置的`len`函数返回切片中有效元素的长度,内置的`cap`函数返回切片容量大小,容量必须大于或等于切片的长度。也可以通过`reflect.SliceHeader`结构访问切片的信息(只是为了说明字符串的结构,并不是推荐的做法)。切片可以和`nil`进行比较,只有当切片底层数据指针为空时切片本身为`nil`这时候切片的长度和容量信息将是无效的。如果有切片的底层数据指针为空但是长度和容量不为0的情况那么说明切片本身已经被损坏了比如直接通过`reflect.SliceHeader``unsafe`包对切片作了不正确的修改)。
和数组一样,内置的`len`函数返回切片中有效元素的长度,内置的`cap`函数返回切片容量大小,容量必须大于或等于切片的长度。也可以通过`reflect.SliceHeader`结构访问切片的信息(只是为了说明切片的结构,并不是推荐的做法)。切片可以和`nil`进行比较,只有当切片底层数据指针为空时切片本身为`nil`这时候切片的长度和容量信息将是无效的。如果有切片的底层数据指针为空但是长度和容量不为0的情况那么说明切片本身已经被损坏了比如直接通过`reflect.SliceHeader``unsafe`包对切片作了不正确的修改)。
遍历切片的方式和遍历数组的方式类似:
@ -437,7 +437,7 @@ a = append(a[:i], append([]int{1,2,3}, a[i:]...)...) // 在第i个位置插入
```go
a = append(a, 0) // 切片扩展1个空间
copy(a[i+1:], a[i:]) // a[i:]向后移动1个位置
s[i] = x // 设置新添加的元素
a[i] = x // 设置新添加的元素
```
第一句`append`用于扩展切片的长度,为要插入的元素留出空间。第二句`copy`操作将要插入位置开始之后的元素向后挪动一个位置。第三句真实地将新添加的元素赋值到对应的位置。操作语句虽然冗长了一点,但是相比前面的方法,可以减少中间创建的临时切片。