golang中slice与底层数组的关系

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值