GoLang-处理零个切片索引的更好方法?

问题描述 投票:0回答:1

所以我是Golang的新手,最近开始了一个利用Excel数据和各种Golang excel库(excelize,tealeg的xlsx)创建报告的项目。

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

如果我尝试在多个for循环之一中使用它们,这些nil slice索引显然会抛出“索引超出范围”,这使我辛辛苦苦地确保了每次我想使用slice索引时,通过使用len()和cap to death()实际上不是nil(下面的代码说明)

    //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交换为string类型的切片和2d / 3d slice中的nil来处理nil索引?还是程序员总是通过删除这些nil或每次他们想要访问某个元素时对其进行检查来“清理”切片的任务?

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

所以我是golang的新手,最近已经启动了一个项目,该项目通过利用excel数据和各种golang excel库(excelize,tealeg的xlsx)来创建报告...]]

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

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

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

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

if rowNumber<len(inputSlice) {
...
}
go slice
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.