如何在Go

时间:2017-08-25 20:03:55

标签: go fsm

以下是一个例子:

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映射中都有相应的条目。

3 个答案:

答案 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
}