恐慌:运行时错误:makelice:超出范围

时间:2018-06-11 00:45:36

标签: go

作为每天练习围棋的练习,我每天都会尝试r / dailyprogrammer的每日挑战之一。

目前,我正在实施中间挑战,#362(https://www.reddit.com/r/dailyprogrammer/comments/8n8tog/20180530_challenge_362_intermediate_route/),这是一个简单的加密/解密挑战。

所以在我的方法中,我有一个基本的结构来表示输入:

type Vector struct {
    x, y int
}

type Input struct {
    text   string
    vector Vector
    method string
}

以及挑战输入的结构片段:

inputs := []Input{
        {"WE ARE DISCOVERED. FLEE AT ONCE", Vector{9, 3}, "clockwise"},
        {"why is this professor so boring omg", Vector{6, 5}, "counter-clockwise"},
        {"Solving challenges on r/dailyprogrammer is so much fun!!", Vector{8, 6}, "counter-clockwise"},
        {"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},
        {"I've even witnessed a grown man satisfy a camel", Vector{9, 5}, "clockwise"},
        {"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},
    }

到目前为止,非常好。

我有一个函数来简化挑战中概述的输入字符串(即一个函数删除所有标点符号并用'X'填充字符串到所需网格的长度)。

之后,我将字符串输入此函数,以创建矩阵网格:

func makeGrid(s string, v Vector) [][]byte {
    g := make([][]byte, v.y, v.x)
    for k, c := range s {
        g[k/v.x] = append(g[k/v.x], byte(c))
    }
    return g
}

因此,对于第一个输入,例如,运行程序将生成如下所示的网格(字符串而不是下面包含的字节,以便于阅读):

[[W E A R E D I S C]
 [O V E R E D F L E]
 [E A T O N C E X X]]

但是,当程序到达此输入时:

{"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},

抛出以下错误:

panic: runtime error: makeslice: cap out of range

此输入相同:

{"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},

我完全可以理解为什么错误是在运行时而不是在编译时,因为在编译期间编译器无法知道网格的大小,因此恐慌只能在运行时发生。

我不明白的是,我在输入中反转向量:

{"For lunch let's have peanut-butter and bologna sandwiches", Vector{12, 4}, "clockwise"},
{"Why does it say paper jam when there is no paper jam?", Vector{14, 3}, "counter-clockwise"},

错误不再发生。程序运行正常。

仅在向量中的x值小于y值的情况下发生。

调试并遵循代码,我不明白为什么有很多短行的网格会抛出错误,而长行很少的网格则不会。

这里似乎还有其他一些可能相关的答案,但我看不出应该如何修改我的方法以避免错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

根据Tim Cooper的回复,这是一个简单的解决方法。

刚刚更改了make语句以正确使用它:

func makeGrid(s string, v Vector) [][]byte {
    g := make([][]byte, v.y)
    for k, c := range s {
        g[k/v.x] = append(g[k/v.x], byte(c))
    }
    return g 
}

现在工作正常。