【问题标题】: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 中明确描述了超出范围的切片访问。

标签: go slice


【解决方案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​​)。跨度>
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2014-06-09
  • 2015-03-14
  • 2017-03-13
相关资源
最近更新 更多