当前位置: 首页 > 面试题库 >

为什么在这种情况下go不会报告“切片边界超出范围”?

洪增
2023-03-14
问题内容

这是要重现的代码:

package main

import "fmt"

func main() {
    var v []int
    v = append(v,1)
    v = append(v,v[1:]...)
    fmt.Println("hi", v)

}

v[1]会报告index out of range,但v[1:]...不会,为什么?


问题答案:

这就是spec定义slice表达式的方式

对于数组或字符串,如果0 <=低<=高<= len(a),则索引在范围内,否则它们超出范围。对于切片,索引的上限是切片容量cap(a)而不是长度。

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

这就是切片的索引表达式的定义方式

如果0 <= x <len(a),则索引x处于范围内,否则超出范围

如果x在运行时超出范围,则会发生运行时恐慌

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

例如:

v[1]恐慌,因为它属于上述定义的范围(因为1不符合0 <= x < len(a)要求)

v[1:]可以正常运行,因为它与要求相同v[1:len(v)]并且符合if 0 <= low <= high <= cap(a)要求。



 类似资料:
  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 问题内容: 因此,当我发现一些非常奇怪的东西时,我正在使用Node.js REPL和Underscore库。如果I ,则该变量是全局设置的(显然)。然后,当我尝试运行一个简单的命令时,它会打印出来(显然,再次)。但是,此后立即运行,因为变量设置为,它会打印。 为什么这样做呢?如果我从js文件运行相同的代码,则不会发生。这是正常的Node事情,还是全部错误? 仅供参考:节点v0.10.10 问题答案

  • 问题内容: 来自问题的原因,或者说更确切地说,object .__new__在这两种情况下的工作方式不同 作者对为什么不感兴趣,而对如何感兴趣。 我非常想了解原因,尤其是: 为什么不打印任何参数而不是 为什么没有为testclass3引发错误?(因为除了自我之外没有其他参数) 码 问题答案: 您正在使用旧的Python版本;此错误消息已更新: Python只会抱怨既不支持又不被覆盖的参数。例如,当

  • 问题内容: 我偶然发现该语句(从一些更复杂的代码中摘录)进行编译: 在短暂但快乐的时刻,我认为受检查的异常最终决定已经死亡,但是对此仍然感到遗憾: 该块不必为空;似乎可以有代码,只要该代码不引发检查异常即可。这似乎是合理的,但是我的问题是,语言规范中的哪个规则描述了此行为?据我所知,§14.18throw语句明确禁止使用它,因为表达式的类型是已检查的异常,并且不会被捕获或声明为被抛出。(?) 问题