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

", len(arr), cap(arr), arr, arr)

arr2 := arr[0:3]

fmt.Printf("len: %d, cap: %d, %p, %+v

", len(arr2), cap(arr2), arr2, arr2)

arr3 := arr[1:3]

fmt.Printf("len: %d, cap: %d, %p, %+v

", len(arr3), cap(arr3), arr3, arr3)

arr4 := arr[4:]

fmt.Printf("len: %d, cap: %d, %p, %+v

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

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

以上是 Go切片的开闭原则 的全部内容, 来源链接: utcz.com/z/516373.html

回到顶部