登录
首页 >  Golang >  Go问答

切片技巧- 不要慌,成功在望

来源:stackoverflow

时间:2024-03-04 19:36:28 293浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《切片技巧- 不要慌,成功在望》,涉及到,有需要的可以收藏一下

问题内容

为什么这段代码有效?具体来说,引用切片范围 a[5:] 并返回零长度切片的行?长度和容量都报告为 5,但引用第六个不存在的元素不会引起恐慌:

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3, 4, 5}
    fmt.Println(a, "Len(a)=", len(a), "Cap(a)=", cap(a))

    fmt.Println(a[4]) // Works as expected
    // fmt.Println(a[5]) // XXX-runtime error:index out of range
    fmt.Println(a[5:]) // Works--returns a zero-length slice--but why?

    a = append(a[:4], a[5:]...)
    fmt.Println(a, "Len(a)=", len(a), "Cap(a)=", cap(a))

}

围棋演示:https://play.golang.org/p/7evt4y0add3

在 go slice 中 - [:n] 和 [n:] 之间的区别,解释是底层数组实际上比切片长,因此访问范围 a[5:] 只是访问更长的数组。但是当您运行此代码时,您会看到切片的长度和容量实际上报告为 5。如果您取消注释对 a[5] 的引用,您会发现这确实会导致预期的恐慌。

我可以依靠这种行为吗?或者我是否遇到了可以在未来版本中修复的规范/编译器错误?


解决方案


这是预期的行为; slice[cap(slice):]slice 末尾的零长度切片。 Per the spec

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

注意是<= len(a),而不是< len(a);根据规范允许使用等于长度/容量的索引。

今天关于《切片技巧- 不要慌,成功在望》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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