Go 切片的开闭原则
前言
今日在工作中踩了一个小坑,关于数组切片的,主要是切片开闭原则的,当年面试的时候考过,但是后来没有仔细研究,这里补足一下。
示例
package main
import "fmt"
func main() {
//程序运行完成时一定要有输出语句,本工具才能正确展示运行结果。
arr := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
fmt.Printf("len: %d, cap: %d, %p, %+v\n", len(arr), cap(arr), arr, arr)
arr2 := arr[0:3]
fmt.Printf("len: %d, cap: %d, %p, %+v\n", len(arr2), cap(arr2), arr2, arr2)
arr3 := arr[1:3]
fmt.Printf("len: %d, cap: %d, %p, %+v\n", len(arr3), cap(arr3), arr3, arr3)
arr4 := arr[4:]
fmt.Printf("len: %d, cap: %d, %p, %+v\n", len(arr4), cap(arr4), arr4, arr4)
}
len: 9, cap: 9, 0xc00010c000, [0 1 2 3 4 5 6 7 8]
len: 3, cap: 9, 0xc00010c000, [0 1 2]
len: 2, cap: 8, 0xc00010c008, [1 2]
len: 5, cap: 5, 0xc00010c020, [4 5 6 7 8]
总结
沟通一个切片的开闭,需要约定一个前提: 语境的开始从0开始,开始从1开始(通常情况从下标0开始)
- 如果从0开始,那么
左闭右开
- 如果从1开始,那么
左开右毕
数组截取切片,关于切片内存地址
- 如果下标从头开始截取(下标:0),则与远数组同一个指针
- 如果下标非从头开始截取,则会产生一个新的内存指针
切片长度(len
)与容量(cap
)
- 长度为切片元素个数
- 容量为截取位置开始至原数组结尾(类同
arr[5:]
)
截取数组剩余所有
new := old[5:]
,使用[start:]
的形式截取,推荐new := old[5:len(old)-1]
,通过计算原数组长度,截取从开始下标至最后一个下标(由于下标从0开始,所以长度减一)
数组拷贝有更多的内容,所以不在这个话题聊了。