如何检查Golang中的值是否为iota常量类型?

如何检查Golang中的值是否为iota常量类型?,go,enums,Go,Enums,我使用Golang中的iota定义了以下类型 type StatusType int const ( PENDING StatusType = iota APPROVED REJECTED ) 我想将REST-API中传递的值限制为StatusType。使值不超过0,1,2。只需不导出StatusType(假设您在包“status”中定义它即可)。 下面是“”: 然后,任何外部包都会引用类似变量的StatusType,如状态、挂起状态、批准状态、或状态、拒绝状态 (实

我使用Golang中的iota定义了以下类型

type StatusType int

const (
    PENDING StatusType = iota
    APPROVED
    REJECTED
)

我想将REST-API中传递的值限制为StatusType。使值不超过0,1,2。

只需不导出
StatusType
(假设您在包“
status
”中定义它即可)。
下面是“”:

然后,任何外部包都会引用类似变量的
StatusType
,如
状态、挂起状态、批准状态、或
状态、拒绝状态

(实现
StatusTyper
接口的仅有三个
StatusTyper
接口。

假设您希望无效的JSON有效负载失败,请实现接口:

我这样做:
首先创建名为“StatusType”的包(在名为StatusType的文件夹中):
文件名:$GOPATH/enum/StatusType/StatusType.go

package StatusType

type Int int

const (
    Pending Int = iota
    Approved
    Rejected
    end
)

func IsValid(value int) bool {
    return value < int(end)
}
StatusType软件包只导出您需要的内容,因此无需检查iota常量范围。
如果要检查,请使用:StatusType.IsValid() StatusType软件包的优点是:
当需要StatusType类型的函数参数时,请使用StatusType.Int,它显示为Int类型的枚举。
比如:

使用go生成


iota只是一个编译器。该代码相当于:

const PENDING int = 0
const APPROVED int = 1
...
因此,要设计一个函数CheckValid(),以确定该值是否在给定值中。 如果常量在连续范围内,则可以使用user6169399的方法。 或者您可以简单地定义一个var映射[YOUR_TYPE_HERE]bool进行验证

func (t YOUR_TYPE) CheckValid(){
    if _, ok:=map[t];ok return true
    else return false
}

这里有另外两种不用地图就能正确完成的方法

主程序包
进口(
“错误”
“日志”
)
类型StatusType int
常数(
挂起状态类型=物联网
经核准的
拒绝
)
函数验证(val int)(布尔,错误){
如果v:=状态类型(val);v>被拒绝| | v被拒绝| | t
细节与您的问题无关,但常量不应大写(C样式)。它是挂起/批准/拒绝的,可能是使
StatusType
未报告的副本,使用接口不会将其剪切。请看我在其中介绍的一个肮脏技巧,它允许使用未报告的方法实现接口。事实上,没有常数类型可以通过这种方式进行限制。@icza Agree(并向上投票)。我考虑过未报告的包装器结构,但我希望尽可能接近OP的原始代码。正如我在回答中所说,“注意适用”。我认为-1是有效的
Test(StatusType.Approved)
package main

import "fmt"

//go:generate enumer -type=StatusType
type StatusType int

const (
    PENDING StatusType = iota
    APPROVED
    REJECTED
)

func main() {
    fmt.Println(StatusType(0).IsAStatusType()) // true
    fmt.Println(StatusType(1).IsAStatusType()) // true
    fmt.Println(StatusType(2).IsAStatusType()) // true
    fmt.Println(StatusType(3).IsAStatusType()) // false
}
const PENDING int = 0
const APPROVED int = 1
...
func (t YOUR_TYPE) CheckValid(){
    if _, ok:=map[t];ok return true
    else return false
}