第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Go:如何使用枚舉作為類型?

Go:如何使用枚舉作為類型?

Go
紅糖糍粑 2022-12-05 16:26:03
我有一個(gè)定義特定事件的事件列表(枚舉):package eventsconst (    NEW_USER       = "NEW_USER"    DIRECT_MESSAGE = "DIRECT_MESSAGE"    DISCONNECT     = "DISCONNECT")并且有一個(gè)結(jié)構(gòu)將使用此枚舉作為其屬性之一type ConnectionPayload struct {    EventName    string      `json:"eventName"`    EventPayload interface{} `json:"eventPayload"`}有沒有一種方法可以enum用作EventName的類型而不是字符串?typescript如果不確定如何在 golang 中執(zhí)行此操作,這是可能的。我希望開發(fā)人員使用枚舉強(qiáng)制使用正確的事件名稱,而不是通過(guò)使用任何隨機(jī)字符串作為 eventname 來(lái)犯錯(cuò)誤。
查看完整描述

3 回答

?
揚(yáng)帆大魚

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"`

}


查看完整回答
反對(duì) 回復(fù) 2022-12-05
?
智慧大石

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è)自定義的解組器。


查看完整回答
反對(duì) 回復(fù) 2022-12-05
?
交互式愛情

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)

}


查看完整回答
反對(duì) 回復(fù) 2022-12-05
  • 3 回答
  • 0 關(guān)注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)