如何检查切片是不是在 Go 中具有给定索引?
Posted
技术标签:
【中文标题】如何检查切片是不是在 Go 中具有给定索引?【英文标题】:How to check if a slice has a given index in Go?如何检查切片是否在 Go 中具有给定索引? 【发布时间】:2015-01-30 20:39:43 【问题描述】:我们可以通过地图轻松做到这一点:
item, ok := myMap["index"]
但不是切片:
item, ok := mySlice[3] // panic!
很惊讶以前没有人问过这个问题。也许我对 Go 切片的心智模型有误?
【问题讨论】:
为什么有这么多反对者?如果有人在这里不高兴,你就不能再提出任何问题了。 我也不明白为什么。认为 map 和 slice 的工作方式相同并非没有道理,就像 std::map 和 std::vector 在 C++ 中具有相似的接口一样。 我(错误地)假设 Go 切片基本上是具有连续 int 键的映射。快速浏览一下语法可以让你采用这种心理模型,顺便说一句。不过,仍然不明白为什么会因此而对一个问题投反对票。让我想知道围棋社区是否被被动攻击性的 CI 学生或其他东西入侵了 LOL @marcioAlmada:我认为问题在于通过查看文档很容易回答这个问题(并且几乎没有努力)。一般而言,SO 社区更喜欢先花一点力气解决问题。你说你自己做了一个错误的假设,因为你只是根据语法猜测。 @marcioAlmada 请停止猜测。 APL 语法和语义在 Java 中不起作用,C++ 语义不适用于 Lisp,并且任何其他语言都不适合引用 Go。我真的可以推荐 Go Tour、Effective Go 和语言参考。例如。 golang.org/ref/spec#Index_expressions 中明确描述了超出范围的切片访问。 【参考方案1】:Go 中没有稀疏切片,因此您可以简单地检查长度:
if len(mySlice) > 3
// ...
如果长度大于 3,则知道索引 3 及其之前的所有索引都存在。
【讨论】:
所以要知道我是否可以得到mySlice[3]
切片需要索引4?这很奇怪。如果索引 3 是最后一个呢?
索引从 0 开始,所以如果你想要索引 3 的东西,你需要长度为 4。
好吧,看来我理解 Go 切片错误了。我认为它基本上是一个带有连续 int 键的地图。快速浏览一下语法可以让你采用这种思维模式:)
@marcioAlmada 听起来你来自 javascript / php。
@OneOfOne 现在你是做出错误假设的人 :) 我使用 C++、Lua、Red、Python、PHP、Javascript 和一点 Ruby(不喜欢 ruby)。跨度>
以上是关于如何检查切片是不是在 Go 中具有给定索引?的主要内容,如果未能解决你的问题,请参考以下文章