14golang基础-slice切片追加与截取

**

追加

**
一般通过append添加元素

	var number = make ([]int,3,5)
	//向numbers切片追加一个元素1,numbers len = 4 ,[0,0,0,1] cap = 5
    numbers = append(numbers,1)

append可以添加任意数量相同类型的元素

numbers = append(numbers,1234)

切片的内存示意大概如下:
14golang基础-slice切片追加与截取_第1张图片
number:头指针
ptr:尾指针永远指向合法元素的最后一个位置
后面两个实际上是非法的,到那时底层已经分配了内存

总结:

  • 切片的长度和容量不同,长度表示左指针到右指针之间的距离,容量表示左指针至底层数组末尾的距离
  • 切片的扩容机制,append的时候,如果长度增加后超过容量,则将容量增加2倍,可通过运行以下代码(1.1)进行实践
  • 如果想修改切片的
//1.1切片的追加
package main

import "fmt"

func main(){
    var number = make ([]int,3,5)//make定义长度,提供容量 3长度,5容量
    
    fmt.Printf("len = %d, cap = %d, slice = %v\n", len(numbers), cap(numbers), numbers)
    
    //向numbers切片追加一个元素1,numbers len = 4 ,[0,0,0,1] cap = 5
    numbers = append(numbers,1)
    
    //向numbers切片追加一个元素1,numbers len = 5 ,[0,0,0,1,2] cap = 5
    numbers = append(numbers,2)
    
    //向一个容量已经满的切片增加一个元素的时候,会自动开辟一个与原来相同容量的空间numbers len = 6 ,[0,0,0,1,2,3] cap = 10
    numbers = append(numbers,3)
    
    fmt.Println("----------")
    var numbers2 = make([]int,3)
    fmt.Printf("len = %d, cap = %d, slice = %v\n",len(numbers2), cap(numbers2),numbers2)
    //向一个容量已经满的切片增加一个元素的时候,会自动开辟一个与原来相同容量的空间numbers此时len = 4, [0,0,0,1], cap=6
    numbers2 = append(numbers2,1)
}

**

截取

**
一般通过[:]的形式截取数组并赋值。

    s := []int{1,2,3}//len = 3, cap = 3
    //[0,2)
    s1 := s[0:2]//[1,2]

但此时因为s和s1是指向同一个地址的,所以如果s1[0]跟更改了s和s1都会被更改
想两个不同的话,go提供了一个copy函数,可以将底层数组的slice一起进行拷贝

//将s中的值,一次拷贝到s1中
copy(s1,s)

可通过运行以下代码(1.2)进行实践

//1.2切片的截取
package main

import "fmt"

func main(){
    s := []int{1,2,3}//len = 3, cap = 3
    //[0,2)
    s1 := s[0:2]//[1,2]
    
    fmt.Println(s1)
    
    s1[0] = 100
    
    fmt.Println(s)
    fmt.Println(s1)
    
    //因为s和s1是指向同一个地址的,所以如果s1[0]跟更改了s和s1都会被更改/
    //想两个不同的话,go提供了一个copy函数
    //copy可以将底层数组的slice一起进行拷贝
    s2 := make([]int,3)//s2 = [0,0,0]
    //将s中的值,一次拷贝到s2中
    copy(s2,s)
    fmt.Println(s2)
}

你可能感兴趣的:(golang,golang,开发语言,后端)