【发布时间】:2018-02-03 22:24:26
【问题描述】:
这是一个例子:
package main
type State int
const (
Created State = iota
Modified
Deleted
)
func main() {
// Some code here where I need the list
// of all available constants of this type.
}
这个用例是创建一个有限状态机 (FSM)。能够获取所有常量将有助于我编写测试用例,以确保每个新值在 FSM 映射中都有对应的条目。
【问题讨论】:
-
我认为你的术语有点不对劲。 go 中没有课程。或许更好的表述是,“获取给定类型包中的所有常量”?
-
唯一想到的就是让它们在
map[string]interface{}或[]interface{}中保持最新。 -
实际上,在内心深处,你根本无法以任何方式做到这一点。 go 中的常量是无类型的。当你以任何方式使用它们时,它们就会被赋予一个类型。如果您可以牺牲它们的无类型性,其中一些建议将起作用。见blog.golang.org/constants。我猜您已经为它们分配了一个类型
State,所以这没什么大不了的,但需要注意一般情况。 -
@IamLearning 您可以聚合有类型或无类型的常量,还可以使用
go/ast及其相关包计算常量表达式。这是一项相当艰巨的工作,因此除非您有大量无法维护的情况需要此操作,否则我建议您按照@captncraig 的答案中的建议手动进行。 -
@RayfenWindspear 这不是真的。正如您链接到的博客文章所示,有类型化的常量,并且问题示例中的那些是类型化的(类型
State在常量声明中指定)。也没有理由将它们放入[]interface{}- 他们可以放入[]State并保持类型安全。