如何在Go中定义用户定义类型的常量值?

时间:2018-10-27 01:33:08

标签: go

我正在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{}的内容,但我看到两个缺点:

  • 每次返回一个空集时,都需要分配一个新值。
  • 由于返回值可以被调用者修改,因此它并不是真正的常量。

您如何定义没有这些限制的空集

1 个答案:

答案 0 :(得分:1)

如果您阅读https://golang.org/ref/spec#Constants,则会发现常量仅限于基本类型。结构,切片或数组不能用作常量。

我认为您能做的最好的事情就是制作一个返回内部空集副本的函数。如果呼叫者对其进行了修改,则无法解决。

实际上,修改它们对他们来说将很困难,因为words中的IntSet是小写的,因此是私有的。如果您在words旁边添加了一个值,例如mut bool,则可以向每个更改if mut的方法添加IntSet检查。如果它不可变,则返回错误或出现紧急情况。

这样,您可以阻止用户修改常量,不可更改的IntSet值。