即使切片的容量为100,但长度为5,仍不能访问第5个之后的元素(下标越界),如下图会报故,只能用append追加。
如果一个切片追加另外一个切片 需要使用 … 不定参格式
切片名传递时并不是真正的指针传递!
切片名包含三个信息:1.切片首个数据的地址,2.切片长度len,3.切片容量cap。
切片在作函数参数传递或做浅拷贝(slice2 := slice1)时,之所以修改一个切片会影响另一个切片的值,是因为他们的切片名中包含的“切片首个数据的地址”相同,可以理解为指向同一片内存,修改一个切片的数据会影响另一个切片中的数据。但是当一个切片的长度和容量改变时,另一个切片名中包含的信息并不会改变!所以切片名传递时并不是真正的指针传递,要解决这个问题就要把切片名当成普通变量用指针传递切片名自身的地址(而不是切片名三个信息中的那个数据首地址)。见指针中的切片指针章节。
在GO语言中,数组作为参数进行传递是值传递,而切片作为参数进行传递是引用传递
(实参与形参切片名中包含的地址信息,并不是真正的切片的地址传递)
func BubbleSort111(slice []int){
fmt.Printf("%p\n",slice)
for i:=0; i<len(slice) -1; i++{
for j:=0;j<len(slice) -1-i;j++{
if slice[j] < slice[j+1]{
slice[j],slice[j+1] = slice[j+1],slice[j]
}
}
}
}
func main() {
//var slice []int //空切片
//var slice []int = []int{1, 2, 3, 4, 5}
slice := make([]int, 10, 10)
//unsafe.Sizeof打印数据类型所占空间,切片名本身是个地址,
// 包括指针、长度、容量,所以64位系统中占3*8个字节
fmt.Println(unsafe.Sizeof(slice))
//不能用cap,要用len
//for i := 0; i < cap(slice); i++ {
// fmt.Print(slice[i]," ")
//}
slice[9] = 1
for i := 0; i < len(slice); i++ {
fmt.Print(slice[i]," ")
}
fmt.Println()
fmt.Println(len(slice), cap(slice))
//当超出一次性追加内容超过原始容量的两倍则按偶数增加,而不是一次次翻倍
slice = append(slice, 1,2,3,4,5,6,7,8,9,10,11)
fmt.Println(slice)
fmt.Println(len(slice))
fmt.Println(cap(slice))
//切片截取
s := slice[1:5:7]
fmt.Println(s, len(s), cap(s))
//切片作为函数参数
fmt.Println(slice)
fmt.Printf("%p\n",slice)
BubbleSort111(slice)
fmt.Println(slice)
}