указатель на nil не равен nil. Переписал приватные функции, чтобы при ошибках они возвращали - не nil с указателем на nil. А чтобы возвращали сам указатель, который равен nil.
Кажется нет смысла возвращать указатель на slice. Так как slice сам по себе весит 24 байт. (8 - len, 8 - cap, 8 - адрес на массив). Убрал в возвращаемых значениях указатели на slice во всем проекте.
Собственно из - за того что возвращались указатели на slice. Заместо проверки len(slice) != 0 были проверки slice != nil . Что тоже неправильно, так как из функции может вернуться slice нулевой длины (что у нас и было в некоторых моментах). А также у нас были указатели на нулевой slice, и тогда slice != nil -> false (надо было бы проверять *slice != nil -> true). Чтобы не зависеть от приватных функций, нужно проверять len(slice) == 0 (если slice равен nil, ответ будет true, len() работает с nil корректно).
Также в одном месте добавил swtich case заместо if'ов.
Тут было несколько фундаментальных проблем.
Также в одном месте добавил swtich case заместо if'ов.