go slice 理解

go slice 理解

切片的定义

切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。

切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。

切片的所在

    // 由于a 指向m a是 {1} 然后 append(a, 4)修改了底层数组,在底层数组[1]处追加了 相当于m[1] = 4
    m := [4]int{1, 2, 3}
    a := m[:1]
    a = append(a, 4) // 修改底层
    fmt.Println(a) // 1 , 4
    fmt.Println(m) // 1 , 4 , 3 , 0


	m := [4]int{1, 2, 3, 4}
	s1 := m[:2]

	s2 := m[:4] // slice 的容量为底层数组,开始切的位置 到 底层数组的最后
	fmt.Printf("s1扩容前地址: %p \n", s1)
	s1 = append(s1, 5, 6, 7) // 因为append添加时如果容量超出则返回的是新切片,对这个新切片操作不会影响原来的
        fmt.Printf("s1扩容后地址: %p \n", s1)
    
	s1 = append(s1, 8)

        fmt.Println(s1) // [1 2 5 6 7 8]
    
        fmt.Println(s2)   // [1 2 3 4]
    
        
        // s1扩容前地址: 0xc0000103a0 
        // s1扩容后地址: 0xc00000e380 
  
   
posted @ 2020-12-15 22:36  菜洋  阅读(166)  评论(0编辑  收藏  举报