Arrays 捕获数组索引错误

Arrays 捕获数组索引错误,arrays,go,error-handling,Arrays,Go,Error Handling,我刚刚开始学习Go,我实现了一个算法,可以检查四个连续的数组索引在对角线方向、垂直方向和水平方向上的值是否相等。我设计它是为了让每个方向都有一个函数,我想知道是否有一种方法可以让我捕获索引错误,而不必检查每个索引是否在索引约束范围内 func (state *State) checkTopLeftDiagonal(row, col int) bool { token := state.Board[row][col] b := token == state.Board[row-3]

我刚刚开始学习Go,我实现了一个算法,可以检查四个连续的数组索引在对角线方向、垂直方向和水平方向上的值是否相等。我设计它是为了让每个方向都有一个函数,我想知道是否有一种方法可以让我捕获索引错误,而不必检查每个索引是否在索引约束范围内

func (state *State) checkTopLeftDiagonal(row, col int) bool {
    token := state.Board[row][col]
    b := token == state.Board[row-3][col-3] && token == state.Board[row-2][col-2] 
                  && token == state.Board[row-1][col-1]
    return b
}

func (state *State) CheckWinner(row, col int) bool {
    for i := 0; i < 4; i++ {
        if state.checkTopLeftDiagonal(row+i, col+i) == true {
            return true
        }
    }
    return false
}
func(state*state)checkTopLeftDiagonal(row,col int)bool{
令牌:=state.Board[行][col]
b:=令牌==状态板[row-3][col-3]&令牌==状态板[row-2][col-2]
&&令牌==状态板[row-1][col-1]
返回b
}
func(state*state)CheckWinner(row,col int)bool{
对于i:=0;i<4;i++{
if state.checkTopLeftDiagonal(行+i,列+i)=真{
返回真值
}
}
返回错误
}
什么开销

“重”和“慢”程序通常每秒处理数十或几十万个数据点。一个if语句可以从计算机每秒经历的数十亿个时钟周期中抽取一把时钟周期(单核机器上的1GHz=十亿个时钟周期)

如果您担心(看起来)一个相当简单的程序的边界检查开销,那么不应该使用Go。你不应该使用C++或C.,你应该直接在汇编中编写这个程序,并且应该花几个小时对每个指令进行微调,以优化纳秒级的比例。 就像评论中提到的@leafbebop一样,任何其他模式都会带来更大的开销


更一般地说,除非您知道需要极高的性能和较低的延迟(如电子股票交易系统、游戏或3D渲染),否则通常最好先构建代码,然后在“分析”代码以识别重要部分后再进行优化。除非你的函数每秒被调用数百万次,否则它所使用的计算能力实际上是零。使代码速度变慢的是对非常大的数据集进行迭代,在等待网络时遇到瓶颈(如果处理数千个网络请求),或者使用大量内存(在千兆字节范围内)

if语句不会使程序变慢


购买更快的硬件几乎总是比购买更快的软件便宜(开发时间更长)。:)

实际上,您可以使用
defer
捕获第一个索引错误,但无法恢复正在计算的表达式。为什么不使用循环呢?我会创建一个方法,返回[row][col]处的值,将边界检查放入其中,如果不在范围内,则返回一个错误或bool。这样做的开销可以忽略不计。边界检查是正确的做法。恢复恐慌比简单的边界检查会产生更多的开销。@Adrian恢复恐慌只会在出错时产生更多的开销,而在成功查找时会产生更少的开销,因为您不需要检查任何东西。“除非我们讨论的是巨大的阵列,否则它们仍然可以忽略不计。”阿迪里奥我对此表示严重怀疑。恢复死机包括一个
延迟
、一个
恢复
和两个错误之间的比较(甚至是类型断言),这比边界检查对我来说开销更大。