2016-05-28 78 views
4

我有一個在golang中使用iota定義的以下類型。如何檢查golang中的iota類型值是否爲常量?

type StatusType int 

const (
    PENDING StatusType = iota 
    APPROVED 
    REJECTED 
) 

我想限制在REST-API中傳遞的值到StatusType。這樣的值不應該超過0,1,2。

+2

細節不相關的問題,但常量不應該大寫(C型)。據掛起/覈准/拒絕 – basgys

+0

可能重複[Golang:創建一個恆定類型和制約型的值(http://stackoverflow.com/questions/37385007/golang-creating-a-constant-type-and-restricting -type-values) – icza

回答

7

簡單地不輸出StatusType(假設你在包'status'中定義它)。
這遵循 「What is an idiomatic way of representing enums in Go?」:然後

type statusType int 

const (
    PENDING statusType = iota 
    APPROVED 
    REJECTED 
) 
type StatusTyper interface { 
    StatusType() statusType 
} 

func(st statusType) StatusType() statusType { 
    return st 
} 

任何外部包將指StatusType - 樣變量作爲status.PENDINGstatus.APPROVEDstatus.REJECTED
(。其實現StatusTyper接口只有三個statusTypeCaveat applies

+0

使'StatusType'未導出並使用一個接口不會削減它。看到我在[Golang:創建常量類型和限制類型的值]中提出的一個骯髒的技巧(http://stackoverflow.com/questions/37385007/golang-creating-a-constant-type-and-restricting-the-類型值),它允許甚至在未導出的方法中實現接口。事實上,這種方式不能限制常量類型。 – icza

+0

@icza同意(和upvoted)。我想過未導出的包裝器結構,但我想盡可能保持接近OP的原始代碼。正如我在回答中所說的,「警告適用」。 – VonC

4

我這樣做是這樣的:
首先創建一個包名爲 「StatusType」(命名爲StatusType一個文件夾中):
文件名:$ GOPATH /枚舉/ StatusType/StatusType.go

package StatusType 

type Int int 

const (
    Pending Int = iota 
    Approved 
    Rejected 
    end 
) 

func IsValid(value int) bool { 
    return value < int(end) 
} 

,並使用這樣的($ GOPATH /枚舉/ main.go):

package main 

import (
    "enum/StatusType" 
    "fmt" 
) 

func Test(enum StatusType.Int) { 
    fmt.Println(enum) //1 
} 
func main() { 
    Test(StatusType.Approved) 

    fmt.Println(StatusType.IsValid(1)) //true 
    fmt.Println(StatusType.IsValid(10)) //false 
} 

的StatusType包剛出口,你需要什麼,所以沒有必要覈對絲毫常量範圍。
以防萬一你要檢查,使用:StatusType.IsValid()
而妙處StatusType包:
當你想StatusType使用類型StatusType.Int的功能參數,並揭示了它的類型枚舉INT。
像:

Test(StatusType.Approved) 
相關問題