前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go切片的开闭原则

Go切片的开闭原则

作者头像
霡霂
发布2020-05-13 09:46:06
2.6K0
发布2020-05-13 09:46:06
举报
文章被收录于专栏:雨过天晴雨过天晴

Go 切片的开闭原则

前言

今日在工作中踩了一个小坑,关于数组切片的,主要是切片开闭原则的,当年面试的时候考过,但是后来没有仔细研究,这里补足一下。

示例

代码语言:javascript
复制
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开始,所以长度减一)

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go 切片的开闭原则
    • 前言
      • 示例
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档