Golang Go语言切片问题求教

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言切片问题求教

初始化切片 s := make([]int, 3) 取 s[3:] 不会报越界错误,取 s[4:]就会越界了, 求教啊

14 回复

这个还真没碰见过,是冷知识?

更多关于Golang Go语言切片问题求教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


s[3:] 是扩展切片,3 代表的是个数不是下标。

我上边的不对。可能就是语言的规定吧,3 代表最后一个元素并且是空(nil?)

> For arrays or strings, the indices are in range if 0 <= low <= high <= len(a), otherwise they are out of range. For slices, the upper index bound is the slice capacity cap(a) rather than the length.

ref: https://golang.org/ref/spec#Slice_expressions

原因未知 :)

但是 fmt.Println(s[3]) 会报错

> The indices low and high select which elements of operand a appear in the result. The result has indices starting at 0 and length equal to high - low

> For convenience, any of the indices may be omitted. A missing low index defaults to zero; a missing high index defaults to the length of the sliced operand.

因此 s[3:] == s[3:len(a)] = s[3:3] ✓
s[4:] == s[4:len(a)] == s[4:3] x



> the index x is in range if 0 <= x < len(a), otherwise it is out of range

ref: https://golang.org/ref/spec#Index_expressions

修正:len(s) 不是 len(a)

故意的吧,
如果 s[3:]就报错,就无法取末尾的空切片了。

错误信息是
panic: runtime error: slice bounds out of range [4:3]
6 楼说的应该就是正确答案了.

缺少的最高位是切片长度,而最高位是开区间,取 s[3:3]的话返回一个 0 长切片,应该是一个规定吧,方便判断。
就和 s[:0]返回一个 0 长切片一样?

在Go语言中,切片(slice)是一个非常强大且灵活的数据结构,它基于数组构建,但提供了更丰富的操作和更高的效率。关于切片,常见的问题可能涉及切片的创建、操作(如追加、删除元素)、以及底层实现机制等。

  1. 切片创建:可以通过字面量、make函数或者从现有数组/切片中截取来创建。例如,s := []int{1, 2, 3}s := make([]int, 0, 10)

  2. 切片操作

    • 追加元素:使用内置的append函数,如s = append(s, 4)
    • 删除元素:切片本身没有直接的删除操作,但可以通过切片操作实现,如s = append(s[:i], s[i+1:]...)删除索引i处的元素。
  3. 底层实现:切片是一个包含指针、长度和容量的结构体。当切片容量不足时,append操作会分配更大的底层数组并复制现有数据。

  4. 注意事项

    • 切片是引用类型,修改切片会影响到底层数组。
    • 切片间的比较是基于指针的,因此不能直接比较两个切片的内容是否相等,需要使用循环或其他方法。

如果你有更具体的问题,比如遇到切片操作的错误、性能优化需求,或者想了解切片在并发环境下的使用,请提供更详细的背景信息,以便给出更针对性的解答。

回到顶部