Go切片的开闭原则

原创
2020/05/12 15:56
阅读数 1.3K

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)
}

Go Playground

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开始,所以长度减一)

数组拷贝有更多的内容,所以不在这个话题聊了。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部