package main
import (
"bytes"
"fmt"
)
func main() {
// 切片只是数组的指针移动
slice_a := []string{"a", "b", "c", "d", "e", "f", "g", "h"}
fmt.Printf("slice_a = %v, len = %d, cap = %d", slice_a, len(slice_a), cap(slice_a))
fmt.Println()
slice_b := slice_a[2:7]
fmt.Printf("slice_b = %v, len = %d, cap = %d", slice_b, len(slice_b), cap(slice_b)) // len 是计算当前切片大小,cap 是计算当当前切片从开始处,到底数组结束处的大小
fmt.Println()
slice_c := slice_b[5:6]
fmt.Printf("slice_c = %v, len = %d, cap = %d", slice_c, len(slice_c), cap(slice_c))
fmt.Println()
超出范围
//slice_d := slice_b[6:7]
//fmt.Printf("slice_d = %v, len = %d, cap = %d", slice_d, len(slice_d), cap(slice_d))
//fmt.Println()
slice_c[0] = "z" // 修改切片中的值,就是修改底层数组的值
fmt.Printf("slice_a = %v, slice_b = %v, slice_c = %v", slice_a, slice_b, slice_c)
fmt.Println()
println("--------------------------------------")
// 解析文件路径,并重新赋值
path := []byte("AAAA/BBBBBBBBB")
sepIndex := bytes.IndexByte(path, '/')
println(sepIndex) // 4
dir1 := path[:sepIndex]
dir2 := path[sepIndex+1:]
println("dir1: ", string(dir1)) // AAAA
println("dir2: ", string(dir2)) // BBBBBBBBB
dir1 = append(dir1, "suffix"...) // ...是将参数打散,一个个的append到dir1当中
println("current path : ", string(path)) // AAAAsuffixBBBB,修改了底层path数组的值
println("current dir2: ", string(dir2)) // uffixBBBB, dir2切片的值,也被同时改变
path = bytes.Join([][]byte{dir1, dir2}, []byte{'/'})
println("new path: ", string(path)) // AAAAsuffix/uffixBBBB // 错误结果
/**
* 解决方法:
* 重新分配新的 slice 并拷贝你需要的数据
* 使用完整的 slice 表达式:input[low:high:max],容量便调整为 max - low
*/
println("--------------------------------------")
path = []byte("AAAA/BBBBBBBBB")
sepIndex = bytes.IndexByte(path, '/') // 4
dir1 = path[:sepIndex:sepIndex] // 此时 cap(dir1) 指定为4, 而不是先前的 16
println("current dir1 : ", string(dir1), len(dir1), cap(dir1))
dir2 = path[sepIndex+1:]
println("current dir2 : ", string(dir2))
dir1 = append(dir1, "suffix"...)
println("current dir1 : ", string(dir1))
path = bytes.Join([][]byte{dir1, dir2}, []byte{'/'})
println("new path: ", string(path)) // AAAAsuffix/BBBBBBBBB
}
golang中slice与底层数组的关系
最新推荐文章于 2024-05-17 00:26:39 发布