因为dir1和dir2事实上都是引用的path,当dir1变化时因为没有超过其容量,所以所以会在引用的地址直接进行修改,因此引起path值的变化。

func main() {
	path := []byte("12345/67890")
	sepIndex := bytes.IndexByte(path, '/')
	println(sepIndex)

	dir1 := path[:sepIndex]
	dir2 := path[sepIndex+1:]
	println("dir1: ", string(dir1))//12345
	println("dir2: ", string(dir2))//67890
	dir1 = append(dir1, "break"...)
	println("dir1: ", string(dir1))//12345break
	println("dir2: ", string(dir2))//reak0
	println("current path: ", string(path))//12345break0
}

可以改为完整的 slice 表达式:input[low:high:max],容量便调整为 max - low。当后续dir1添加新元素时,会超过数组容量,因而引发了切片的扩容,分配新的slice,所以不影响原来的值。

func main() {
	path := []byte("12345/67890")
	sepIndex := bytes.IndexByte(path, '/')
	println(sepIndex)

	dir1 := path[:sepIndex:sepIndex]
	dir2 := path[sepIndex+1:]
	println("dir1: ", string(dir1)) //12345
	println("dir2: ", string(dir2)) //67890
	dir1 = append(dir1, "break"...) 
	println("dir1: ", string(dir1))//12345break
	println("dir2: ", string(dir2))//67890
	println("current path: ", string(path)) //12345/67890
}

向一个 slice 中追加元素而它指向的底层数组容量不足时,将会重新分配一个新数组来存储数据。而其他 slice 还指向原来的旧底层数组。