menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 07.4.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    07.4.md
    2.07 KB / 2024-07-16 23:14:27
        # 7.4 切片重组 (reslice)
    
    我们已经知道切片创建的时候通常比相关数组小,例如:
    
    ```go
    slice1 := make([]type, start_length, capacity)
    ```
    
    其中 `start_length` 作为切片初始长度而 `capacity` 作为相关数组的长度。
    
    这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 **reslicing**,做法如下:`slice1 = slice1[0:end]`,其中 `end` 是新的末尾索引(即长度)。
    
    将切片扩展 1 位可以这么做:
    
    ```go
    sl = sl[0:len(sl)+1]
    ```
    
    切片可以反复扩展直到占据整个相关数组。
    
    示例 7.11 [reslicing.go](examples/chapter_7/reslicing.go)
    
    ```go
    package main
    import "fmt"
    
    func main() {
    	slice1 := make([]int, 0, 10)
    	// load the slice, cap(slice1) is 10:
    	for i := 0; i < cap(slice1); i++ {
    		slice1 = slice1[0:i+1]
    		slice1[i] = i
    		fmt.Printf("The length of slice is %d\n", len(slice1))
    	}
    
    	// print the slice:
    	for i := 0; i < len(slice1); i++ {
    		fmt.Printf("Slice at %d is %d\n", i, slice1[i])
    	}
    }
    ```
    
    输出结果:
    
    	The length of slice is 1
    	The length of slice is 2
    	The length of slice is 3
    	The length of slice is 4
    	The length of slice is 5
    	The length of slice is 6
    	The length of slice is 7
    	The length of slice is 8
    	The length of slice is 9
    	The length of slice is 10
    	Slice at 0 is 0
    	Slice at 1 is 1
    	Slice at 2 is 2
    	Slice at 3 is 3
    	Slice at 4 is 4
    	Slice at 5 is 5
    	Slice at 6 is 6
    	Slice at 7 is 7
    	Slice at 8 is 8
    	Slice at 9 is 9
    
    另一个例子:
    
    ```go
    var ar = [10]int{0,1,2,3,4,5,6,7,8,9}
    var a = ar[5:7] // reference to subarray {5,6} - len(a) is 2 and cap(a) is 5
    ```
    
    将 `a` 重新分片:
    
    ```go
    a = a[0:4] // ref of subarray {5,6,7,8} - len(a) is now 4 but cap(a) is still 5
    ```
    
    **问题 7.7**
    
    1) 如果 `a` 是一个切片,那么 `a[n:n]` 的长度是多少?
    
    2) `a[n:n+1]` 的长度又是多少?          
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[For-range 结构](07.3.md)
    - 下一节:[切片的复制与追加](07.5.md)
    
    
    links
    file_download