Как написать красивый и чистый пакет Go? - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь реализовать разреженные наборы из этой статьи в Go и собрать их в пакет.В ранней реализации API был чистым и минимальным, только с экспортированным типом Sparse и экспортированным методом Insert, Delete, Has, Union, Intersection, Clear и Len, довольномного только операций с базовыми наборами.

Позже я хочу добавить новые функциональные возможности, которые могут автоматически резервировать элемент (давайте назовем его AutoSparse).Если Sparse имеют Insert(k int), которые вставляют k в наборы, AutoSparse имеют Reserved() зарезервировали доступный элемент.Если у меня {0 1 2 4 5} в AutoSparse, когда я звоню Reserve(), он должен добавить 3, а не 6, так что теперь он становится {0 1 2 4 5 3}.Вот реализация на детская площадка .

Как вы можете видеть, чтобы поддерживать, какой элемент добавляется в наборы, он не добавляет новое поле в struct, и я хочуоставьте это так.

Мой вопрос: как добавить эту новую функциональность в мой пакет без добавления нового экспортируемого типа AutoSparse, чтобы сохранить API чистым и минимальным?

Это то, что я уже пробовал:

  1. Я могу использовать interface, чтобы скрыть реализацию, но сигнатура функции отличается, одно использование Insert(k int), другое использование Reserve(),даже если я использую имя Insert(), оно все равно другое, или я должен использовать Insert(k int), но не использовал k вообще?может, но это неудобно.
  2. Я не могу использовать тот же struct для реализации этого, потому что как только вы используете Reserve() для добавления элемента, вы не можете использовать Insert(k int), потому что это испортитЗарезервированный элемент, даже Delete и Clear отличается.

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете использовать k... int в качестве параметра.

func (sparse Sparse) Insert(k... int) error {
    if len(k) == 0 {
        // first case
        return nil
    } else if len(k) == 1 {
        // second case
        return nil
    } else {
        return errors.New("Too many arguments")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...