首页 > 解决方案 > 处理零切片索引的更好方法

问题描述

我已经开始了一个使用 excel 数据和各种 Go excel 库(excelize、tealeg 的 xlsx)创建报告的项目

我发现的最大挫折之一是使用根据数据源具有一些​​ nil 索引的切片(当我使用 xlsx 库提取数据时,输入数据传输中的空白行作为“nil”切片索引)

如果我尝试在我的许多 for 循环之一中使用它们,这些 nil 切片索引显然会抛出一个“超出范围的索引”——这导致我完成一项艰巨的任务,即确保每次我想要使用的切片索引是't 实际上 nil 通过使用 len() 和 cap to death()(下面的代码摘录来说明)

    //example code excerpt
    for rowNumber, cellStringSlice := range inputSlice {
        for rowColumn, cellString := range cellStringSlice {
            //loop var declaration
            rowColumnHeading := 2 
            rowNumberInc := rowNumber + 1
            rowNumberDec := rowNumber - 1

            if rowNumber > 0 {
                if len(inputSlice[rowNumber]) != 0 { //len check to stop index out of range issue with slice
                    previousColACellValue = inputSlice[rowNumber][rowColumn]
                    continue
                }

            if len(inputSlice[rowNumber+1]) != 0 { //len check to stop index out of range issue with slice
                        nextColACellValue = inputSlice[rowNumber+1][rowColumn]
                        continue
                    }
                }

            }

我应该指定在这个 2D 切片中我正在使用:

inputSlice[rowNumber][rowColumn]

近端切片(rowNumber)从不为零(总是有一行)但是它索引的第二个远端切片(rowColumn)在某些情况下可以为 nil - 这就是为什么在这种情况下我的整个循环总是进入第二个内部循环,即使当它正在迭代没有列数据的行(即 inputSlice[rowNumber][rowColumn] = nil),并且经常需要我处理索引超出范围的问题

我不能只删除所有 nil 索引并将所有内容向上移动,因为这些在我将这些行输出到的最终 excel 文档中代表“空白行”。

所以我的问题是,是否有任何有用的 go 函数或库通过将所有 nil 交换为切片和字符串类型的 2d/3d 切片中的 "" 来处理 nil 索引?或者程序员的任务是通过删除这些 nil 来“清理”他的切片,或者每次他们想要访问一个元素时检查它们?

我很感激我可以自己编写一个 for 循环来将所有这些 nil 替换为“”,但是每次我使用包含/可能包含 nil 的字符串切片时编写一个函数来执行此操作对我来说似乎有点奇怪

标签: goslice

解决方案


您的外循环是 on inputSlice,因此inputSlice[rowNumber]始终有效,并且由于内循环在该行上,因此它永远不会为零。因此第一次检查是不必要的。如果您有一个 nil 或空切片 for inputSlice[rowNumber],则甚至不会进入内部 for 循环。

第二次检查是必要的,但错误:

if len(inputSlice[rowNumber+1]) != 0 { 

如果rowNumber是最后一行,则inputSlice[rowNumber+1]无效,因为不存在这样的行。你必须检查:

if rowNumber<len(inputSlice) {
...
}

推荐阅读