如何在Go语言中检查切片是否具有给定的索引?

94

我们可以通过地图轻松实现:

item, ok := myMap["index"]

但是切片不行:

item, ok := mySlice[3] // panic!

惊讶之前没有人问过这个问题。也许我对Go的slice有错误的思维模式?


56
为什么会有这么多人踩呢?在这里你问任何问题都可能会惹恼某些人。我不明白。 - marcio
4
我也不明白。认为在Go语言中,像map和slice这样的数据结构应该有类似C++的std::map和std::vector一样的接口,这并不是不合理的想法。 - laurent
6
我错误地认为Go切片基本上是具有连续int键的映射。通过快速查看语法,您可能会采用这种心理模型,顺便说一句。不过,我仍然不明白为什么因此想要对问题进行投票贬低。这让我想知道Go社区是否正在被消极攻击性的CI学生之类的人入侵,哈哈。 - marcio
2
“shows little effort”这个评价是相对而言的。如果按照这个标准,你需要downvote掉80%的[go]问题,因为它们都是关于Go语言的教程、文档或语言规范的:https://dev59.com/jnI-5IYBdhLWcg3wBjhR - marcio
3
@marcioAlmada请停止猜测。 APL的语法和语义不适用于Java,C ++的语义不适用于Lisp,而任何其他语言都不是Go的合适参考。我真的可以推荐Go Tour、Effective Go和语言参考。例如,关于范围切片访问的详细信息可以在http://golang.org/ref/spec#Index_expressions中清楚地描述。 - Volker
显示剩余5条评论
1个回答

81

Go语言中没有稀疏切片,所以您可以简单地检查长度:

if len(mySlice) > 3 {
    // ...
}

如果长度大于3,那么你知道索引3及其之前的所有内容都是存在的。


17
索引从0开始,因此如果您想要索引为3的东西,您需要长度为4。 - laurent
1
好的,看来我对Go语言的切片理解有误。我以为它基本上是一个具有连续int键的映射。快速查看语法可能会让你采用这种心理模型 :) - marcio
3
听起来你可能是从 JavaScript/PHP 转过来的。 - OneOfOne
1
@OneOfOne 现在你是在做错误的假设 :) 我使用 C++, Lua, Red, Python, PHP, Javascript 还有一点 Ruby(不喜欢 Ruby)。 - marcio
4
Go语言显然不是以程序员为中心开发的。 - Sentinel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接