【问题标题】:Test Index out of range golang测试索引超出范围golang
【发布时间】:2015-03-10 23:51:56
【问题描述】:

抱歉这个菜鸟问题,但我不确定如何测试我正在访问的元素是否对数组有效,请考虑以下人为代码:

func main() {
    strings := []string{"abc", "def", "ghi", "jkl"}
    for i := 0; i<5; i++ {
        if strings[i] {
            fmt.Println(strings[i])
        }
    }
}

https://play.golang.org/p/8QjGadu6Fu

我显然超出了界限,但我不确定如何测试以防止错误。我习惯了 PHP,我会使用 isset!empty 测试,go 有这样的东西吗?

我浏览了其他问题并看到使用了len 函数,但这似乎不起作用。

【问题讨论】:

  • 使用len函数获取切片的长度。

标签: arrays go


【解决方案1】:

在 Go 中,这并不像在 PHP 中那么容易——但请记住,在 PHP 中这很容易,因为“索引”数组实际上是引擎盖下的关联数组。否则,您将无法通过取消设置单个元素来“打孔”到数组中。

使用 Go 数组/切片,您必须实际检查数组的长度,正如您所写:

if i>=0 && i<len(strings) {...}

就我个人而言,我还没有遇到需要这样做的现实情况 - 在您的示例中,您可以使用 range(strings) 并停止担心索引。

使用映射,它是 PHP 数组的 Go 等价物,您可以通过以下方式执行“isset”:

value, isset := map[index]

如果index 出现在地图中,value 将被适当设置,isset 将为真;如果不是,value 将设置为地图类型的零值,isset 将为 false。

【讨论】:

  • 谢谢,我认为问题更多在于我对如何编写 Go 的思考,而不是 Go 缺乏测试元素的能力。我确实有这样做的“现实生活”情况,但这可能是因为我仍在学习如何正确编写 Go
【解决方案2】:

len() 应该返回切片的元素数。

nil slice、map 或 channel 的长度为 0。(https://golang.org/ref/spec#Length_and_capacity)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多