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

Я реализую битовый вектор в Go:

// A bit vector uses a slice of unsigned integer values or “words,”
// each bit of which represents an element of the set.
// The set contains i if the ith bit is set.
// The following program demonstrates a simple bit vector type with these methods.
type IntSet struct {
    words []uint64 //uint64 is important because we need control over number and value of bits
}

Я определил несколько методов (например, проверка членства, добавление или удаление элементов, операции над множествами, такие как объединение, пересечение и т. Д.).) на нем у всех есть указатель получателя.Вот один из таких методов:

// Has returns true if the given integer is in the set, false otherwise
func (this *IntSet) Has(m int) bool {
   // details omitted for brevity
}

Теперь мне нужно возвращать пустой набор, который является истинной константой, чтобы я мог использовать одинаковую константу каждый раз, когда мне нужно обратитьсяна IntSet, который не содержит элементов.Один из способов - вернуть что-то вроде &IntSet{}, но я вижу два недостатка:

  • Каждый раз, когда должен быть возвращен пустой набор, необходимо выделить новое значение.
  • Возвращаемое значение не является на самом деле постоянным, поскольку оно может быть изменено вызывающими.

Как определить нулевой набор , который не имеет этих ограничений?

1 Ответ

0 голосов
/ 27 октября 2018

Если вы прочитаете https://golang.org/ref/spec#Constants, вы увидите, что константы ограничены базовыми типами. Структура, фрагмент или массив не будут работать как константа.

Я думаю, что лучшее, что вы можете сделать, - это создать функцию, которая возвращает копию внутреннего пустого набора. Если звонящие изменяют его, это не то, что вы можете исправить.

На самом деле изменение было бы для них затруднительным, поскольку words внутри IntSet строчные и поэтому являются частными. Если вы добавили значение рядом с words, например mut bool, вы можете добавить проверку if mut к каждому методу, который изменяет IntSet. Если он не изменчив, верните ошибку или панику.

При этом вы могли бы удерживать пользователей от изменения постоянных, неизменяемых IntSet значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...