繁体   English   中英

Golang子切片

[英]Golang sub slice

在 Go 中,为什么这段代码有效:

package main

import (
  "fmt"
)

func main() {
  a := []int{1}
  a = a[1:]
  fmt.Println(len(a))
}

但这不是:

package main

import (
  "fmt"
)

func main() {
  a := []int{1}
  a = a[2:]
  fmt.Println(len(a))
}

我听说过切片容量,有人可以详细说明吗?

Go 规范包含对您的两个问题的答案:

切片表达式

切片表达式从字符串、数组、指向数组的指针或切片构造子字符串或切片。 有两种变体:一种是指定上下限的简单形式,另一种是同时指定容量范围的完整形式。

简单的切片表达式

[截图]

对于数组或字符串,如果0 <= low <= high <= len(a) ,则索引在范围内,否则它们超出范围

由于len(a)1 ,索引 1 在范围内,但索引 2 超出范围。

完整切片表达式

对于数组、指向数组的指针或切片a (但不是字符串),主要表达式

a[low : high : max]

构造一个与简单切片表达式a[low : high]相同类型的切片,并且具有相同的长度和元素。 此外,它通过将结果设置为max - low来控制结果切片的容量。 只能省略第一个索引; 它默认为 0。...

阅读整个规范。 它可能会有点慢,但不会那么长。 没有必要记住所有内容,但是在经历了整个事情一次之后,您应该能够记住您在某处阅读过该内容,然后返回并找到您要查找的内容。

切片的容量总是至少与切片的长度相同。 未指定时,默认值始终与长度相同。

切片长度的定义是放入切片的元素个数。

切片容量的定义是切片可以提供的整个块,它对调用者是隐藏的,默认值为空(0 表示 int,"" 表示字符串)。

当您像这样调用某个索引的值a[x] ,它将在lenght范围内获取索引x处的值。

但是,当您像这样a[x:y]重新切片切片时,它将在容量范围内获得索引x处的切片,直到 y(最大值必须与容量相同)。 所以作为slice的调用者,你可以得到整个slice结构中默认值为空的slice的隐藏元素。

如果您没有像上面那样指定重新切片(y)的结束 -> a[2:],那么重新切片的默认结束将设置为lenght ,这将使您调用a[2:]暗示a[2:1]因为切片的长度是 1。想想看,调用a[2:1]的子切片,会发生什么?。 正如错误消息告诉我们的那样:

恐慌:运行时错误:切片边界超出范围 [2:1]

因为您正在从索引中调用子切片,该索引甚至不在容量范围内(切片的整个结构本身)。 即使 2 在切片的容量范围内,您的调用也会重叠,因为起始索引大于容量。

总结:

  • 如果你这样调用 sub-slice -> a[x:] 那么 x 必须在长度范围内(包括)
  • 如果你这样调用 sub-slice -> a[:y] 那么 y 必须在容量范围内(包括)
  • 如果您像这样调用子切片 -> a[x:y] 那么 x 和 y 必须在容量(包括)和 x<=y 的范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM