以下是一个例子:
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映射中都有相应的条目。
答案 0 :(得分:5)
在运行时无法执行此操作,因为无法使用反射包。您可以定义一个列表:
const(
Created State = iota
Modified
Deleted
)
var allStates = []State{Created, Modified, Deleted}
您可以更进一步,添加字符串表示或任何其他内容。
您可以从源生成这样的列表以使维护更容易,但我通常认为这不足以节省时间。像stringer这样的工具已经可以做到这一点了。
答案 1 :(得分:5)
如果你的常数都在一个订单中,你可以使用它:
type T int
const (
TA T = iota
TB
TC
NumT
)
func AllTs() []T {
ts := make([]T, NumT)
for i := 0; i < int(NumT); i++ {
ts[i] = T(i)
}
return ts
}
您也可以将输出缓存在例如init()
。这仅适用于按顺序初始化所有常量iota
的情况。如果您需要适用于所有情况的内容,请使用显式切片。
答案 2 :(得分:-1)
package main
import (
"fmt"
)
type State int
const (
Created State = iota
Modified
Deleted
)
func (s State) Name() (name string) {
switch s {
case Created:
name = "created"
case Modified:
name = "modified"
case Deleted:
name = "deleted"
}
return
}
func main() {
states := States()
fmt.Println(states)
}
func States() (states []State) {
state := State(0)
for {
name := state.Name()
if name == "" {
break
}
states = append(states, state)
state++
}
return
}