登录
首页 >  Golang >  Go问答

处理切片索引边缘情况

来源:stackoverflow

时间:2024-03-20 17:21:41 335浏览 收藏

在 Go 中,切片索引使用半开范围,即从 a[low] 到 a[high-1],不包含 a[high]。然而,对于切片索引边缘情况,如 t[0:0] 和 t[1:1],它们虽然在语法上是有效的,但会引用不存在的索引。这是因为半开范围要求上限永远不能小于下限,但它们可以是任何有效的索引或超过末尾的索引。因此,t[0:0] 表示开始然后立即停止,给出零长度范围,而 t[0:1] 是长度为 1 的切片,t[2:2] 和 t[1:0] 则无效。

问题内容

在 go 中,切片索引使用半开范围。对于a[low:high],切片包含a[low]但排除a[high]。参考:https://tour.golang.org/moretypes/7。另一种思考方式是它从 a[low] 到 a[high-1](包含在内)。

但是请看一下这段代码。您可以在以下位置运行它:https://play.golang.com/p/dsls7v8gom0

func main() {
    t := []int{5}
    fmt.Println(t)
    fmt.Println(t[0:0])
    fmt.Println(t[1:1])
}

如果您运行代码,您可以看到 t[0:0] 和 t[1:1] 都是有效且允许的。

t[0:0] 表示包含 t[0](存在)但在 t[0](不存在的 t[-1])之前停止。

t[1:1] 表示包含 t[1](不存在)但在 t[1](存在的 t[0])之前停止。

在这两种情况下,其中一个索引引用了不存在的东西,即索引超出范围==>但语法上是完美的并且在 golang 中是允许的!!

但是,如果您尝试任何其他索引,例如 t[2],编译器预计会大声抱怨。


解决方案


您需要将范围视为从较低值开始并在达到较高值时停止。上限永远不能小于下限,但它们可以是任何有效的索引或超过末尾的索引 - 即示例中的 0 或 1。

因此 t[0:0] 表示开始然后立即停止,给出零长度范围。例如:

t[0:0]t[1:1] 是有效的零长度切片

t[0:1] 是长度为 1 的切片

t[2:2]t[1:0] 无效

我在博客中详细解释了半开范围的优点,并且不将零作为特殊情况 - 例如参见 http://devmethodologies.blogspot.com/2012/12/asymmetric-bounds-and-zero-based.html

理论要掌握,实操不能落!以上关于《处理切片索引边缘情况》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>