3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以通過(guò)生成如下代碼來(lái)實(shí)現(xiàn)。
type EventNames string
const (
NEW_USER EventNames = "NEW_USER"
DIRECT_MESSAGE EventNames = "DIRECT_MESSAGE"
DISCONNECT EventNames = "DISCONNECT"
)
然后將您的結(jié)構(gòu)更改為此:
type ConnectionPayload struct {
EventName EventNames `json:"eventName"`
EventPayload interface{} `json:"eventPayload"`
}

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
目前 go 中沒有枚舉類型,目前也沒有直接的方法來(lái)執(zhí)行與 typescript 相同的規(guī)則。
go 中的一個(gè)常見做法是使用@ttrasn發(fā)布的建議:
定義自定義類型,并使用您的“枚舉”值鍵入常量:
type EventName string
const (
NEW_USER EventName = "NEW_USER"
DIRECT_MESSAGE EventName = "DIRECT_MESSAGE"
DISCONNECT EventName = "DISCONNECT"
)
這允許你在你的 go 代碼中標(biāo)記你期望這樣一個(gè)值的地方:
// example function signature :
func OnEvent(e EventName, id int) error { ... }
// example struct :
type ConnectionPayload struct {
EventName EventName `json:"eventName"`
EventPayload interface{} `json:"eventPayload"`
}
并且它將阻止將平原分配string給EventName
var str string = "foo"
var ev EventName
ev = str // won't compile
OnEvent(str, 42) // won't compile
已知的限制是:
在 go 中,總是有一個(gè)零值:
var ev EventName // ev is ""
字符串文字與類型化變量不同,可以賦值:
var ev EventName = "SOMETHING_ELSE"
允許鑄造:
var str string = "foo"
var ev EventName = EventName(str)
沒有檢查解組:
jsn := []byte(`{"eventName":"SOMETHING_ELSE","eventPayload":"some message"}`)
err := json.Unmarshal(jsn, &payload) // no error
https://go.dev/play/p/vMUTpvH8DBb
如果你想要一些更嚴(yán)格的檢查,你將不得不自己編寫一個(gè)驗(yàn)證器或一個(gè)自定義的解組器。

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
嘗試這個(gè):
package main
import (
"fmt"
"gopkg.in/go-playground/validator.v9"
)
type EventName string
const (
NEW_USER EventName = "NEW_USER"
DIRECT_MESSAGE EventName = "DIRECT_MESSAGE"
DISCONNECT EventName = "DISCONNECT"
)
type ConnectionPayload struct {
EventName EventName `json:"eventName" validate:"oneof=NEW_USER DIRECT_MESSAGE DISCONNECT"`
EventPayload interface{} `json:"eventPayload"`
}
func (s *ConnectionPayload) Validate() error {
validate := validator.New()
return validate.Struct(s)
}
func main() {
a := ConnectionPayload{
EventName: "NEW_USER",
}
b := ConnectionPayload{
EventName: "NEW_USERR",
}
err := a.Validate()
fmt.Println(a, err)
err = b.Validate()
fmt.Println(b, err)
}
- 3 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報(bào)