Go 数组和切片的区别

内部实现

  • 数组
    数组是一个长度固定的数据类型,用于存储一段具有相同类型的元素的连续块。数组存储的类型可以是内置类型,如整型或者字符串,也可以是某种结构类型。
  • 切片
    切片是围绕动态数组的概念构建的,可以按需自动增长和缩小
    切片是一个很小的对象,对底层数组进行了抽象,并提供了相关的操作方法。切片有3个字段分别是指向底层数组的指针切片访问的元素个数(即长度)切片允许增长到的元素个数(即容量)

声明和初始化

  • 数组
    //声明一个包含5个元素的整型数组,并设置为零值
    var array [5]int
    //使用数组字面量声明数组
    array := [5]int{10,20,30,40,50}
    //隐式声明数组长度
    array := [...]int{10,20,30,40,50}
    //声明数组并指定特定元素
    array := [5]int{0:10,2:30}
    
  • 切片
    //使用make
    //长度和容量都是5个元素
    slice := make([]string, 5)
    //长度为3,容量为5个元素
    slice := make([]int, 3, 5)
    
    //使用字面量声明
    //长度和容量都是4个元素
    slice := []string{"red","blue","green","yellow"}
    //声明切片 并指定特定元素 长度容量都是100
    slice := []string{99:"!!"}
    

赋值

  • 数组
    func main() {
        var array1[5]string
        array2:=[5]string{"Red","Blue","Green","Yellow","Pink"}
    
        //把array2的值复制到array1
        array1=array2
        array1[0] = "Black"
        fmt.Println(array1)
        fmt.Println(array2)
    }
    

    如图数组赋值仅仅是复制数组的值


  • 切片
    func main() {
        slice := []int{1,2,3,4,5}
        slice2 := slice
        slice2[1] = 100
        fmt.Println(slice)
        fmt.Println(slice2)
    }
    
    切片赋值,仅仅是复制切片的指针、长度和容量

函数传递

  • 数组
    在函数之间传递变量时,总以值的方式传递的
    func test(arr [3]int) {
        arr[2] = 300
    }
    
    func test1(arr *[3]int) {
        arr[1] = 200
    }
    
    func main() {
        arr := [...]int{1,2,3}
        fmt.Println(arr)
        test(arr)
        fmt.Println(arr)
        test1(&arr)
        fmt.Println(arr)
    }
    
  • 切片
    在函数间传递切片就是要在函数间以值的方式传递切片
    func test(slice []int) {
        slice[1] = 100
    }
    
    func main() {
        slice := []int{1,2,3,4,5}
        test(slice)
        fmt.Println(slice)
    }
    
    在64位机上,一个切片需要24字节的内存,指针x8,长度和容量x8,由于与切片关联的数据包含在底层数组里,不属于切片本身,所以将切片复制到任意函数的时候,对底层数组的大小都不会有影响。复制时只会复制切片本身,不会涉及到底层数组

你可能感兴趣的:(Go 数组和切片的区别)