Лучший способ справиться с индексами нулевого среза - PullRequest
0 голосов
/ 22 марта 2020

Я начал проект по созданию отчетов с использованием данных Excel и различных Go библиотек Excel (excelize, xalex от tealeg)

Одно из самых больших разочарований, которое я обнаружил, - это работа со срезами, которые имеют некоторые нулевые индексы в зависимости от источника данных (пустые строки во входных данных передаются как индексы среза «ноль», когда я использую библиотеку xlsx для извлечения данных)

Эти индексы с нулевым срезом выбрасывают «индекс вне диапазона» очевидно, что если я когда-нибудь попытаюсь использовать их в одном из моих многочисленных циклов for, что приведет меня к кропотливой задаче - гарантировать каждый раз, когда я хочу работать с индексом среза, который на самом деле не равен нулю, с помощью len () и cap для 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) никогда не равен nil (всегда есть строка) однако второй дистальный срез, который он индексирует (rowColumn), может быть нулевым в некоторых случаях - вот почему в этом сценарии мой общий l * 1 019 * всегда вводит второй внутренний l oop, даже если он выполняет итерацию, хотя строка без данных столбца (т. Е. InputSlice [rowNumber] [rowColumn] = nil), и мне часто приходится обрабатывать индекс из-за проблем диапазона

Я не могу просто удалить все нулевые индексы и сдвинуть все вверх, так как они представляют «пустые строки» в окончательном Excel. c Я вывожу эти строки в.

Так что мой Вопрос в том, существуют ли какие-нибудь полезные функции или библиотеки go, которые заботятся о индексах nil, заменяя все nils на "" в срезах и 2d / 3d срезах типа string? Или это задача для программиста всегда «дезинфицировать» свои фрагменты, удаляя эти nils или проверяя их каждый раз, когда они хотят получить доступ к элементу?

Я ценю, что мог бы написать для l oop Я могу поменять местами все эти nils на «», но написание функции, которая делает это каждый раз, когда я работаю со строками, содержащими / возможно содержащими nil, показалось бы мне немного странным

1 Ответ

1 голос
/ 22 марта 2020

Ваш внешний l oop включен inputSlice, поэтому inputSlice[rowNumber] всегда действителен, и, поскольку внутренний l oop находится в этом ряду, он никогда не равен нулю. Таким образом, первая проверка не нужна. Если у вас есть ноль или пустой срез для inputSlice[rowNumber], внутренний для l oop даже не будет введен.

Вторая проверка необходима, но неверна:

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

Если rowNumber является последней строкой, то inputSlice[rowNumber+1] недопустим, поскольку такой строки не существует. Вы должны проверить:

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