我正在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
时都可以使用 same 常数。一种方法是返回类似&IntSet{}
的内容,但我看到两个缺点:
您如何定义没有这些限制的空集?
答案 0 :(得分:1)
如果您阅读https://golang.org/ref/spec#Constants,则会发现常量仅限于基本类型。结构,切片或数组不能用作常量。
我认为您能做的最好的事情就是制作一个返回内部空集副本的函数。如果呼叫者对其进行了修改,则无法解决。
实际上,修改它们对他们来说将很困难,因为words
中的IntSet
是小写的,因此是私有的。如果您在words
旁边添加了一个值,例如mut bool
,则可以向每个更改if mut
的方法添加IntSet
检查。如果它不可变,则返回错误或出现紧急情况。
这样,您可以阻止用户修改常量,不可更改的IntSet
值。