亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GO 中自定義類型的 ENUM

GO 中自定義類型的 ENUM

Go
慕哥9229398 2021-12-27 18:05:23
我正在嘗試為我定義的類型生成一個枚舉type FeeStage int從這個我知道,我可以用絲毫基于這種類型來創建一個枚舉const(     Stage1 FeeStage = iota     Stage2      Stage3)但是,操作枚舉的實際值相當麻煩且容易出錯const(     Stage1 FeeStage = iota           // 0     Stage2          = iota + 6       // 7     Stage3          = (iota - 3) * 5 // -5)有沒有辦法將具有自定義值的 ENUM 列表自動轉換為某種類型。這是我之前使用的,但只將常量的第一個成員轉換為自定義類型。const(     Stage1 FeeStage = 1     Stage2          = 2     Stage3          = 2)這是一個具有類似結果的游樂場
查看完整描述

3 回答

?
Helenr

TA貢獻1780條經驗 獲得超4個贊

除了使用iota和自動枚舉,或者做最簡單的事情之外,別無他法:


const(

     Stage1 FeeStage = 1

     Stage2 FeeStage = 2


     // or another syntax with same results

     Stage3 = FeeStage(2)

)

恕我直言,這比做iota + 5你所說的那樣真的很糟糕。


如果值在程序上下文之外不重要,我通常要么使用 iota,要么在需要在協議或其他東西中使用這些值時使用顯式類型。


雖然我不得不說有時只使用整數或字符串就足夠了,但這取決于上下文。例如,參見標準庫中的http 狀態代碼。他們沒有特殊類型。


查看完整回答
反對 回復 2021-12-27
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

您可能應該澄清您實際上想要用枚舉常量做什么,但看起來您正在嘗試為您的自定義類型分配任意值。

iota如果您構建常量和要排序的初始化并遵循模式,則使用不需要很麻煩。 Effective Go也有一個關于這個的部分。

您可以為枚舉常量創建相當復雜的模式,這不一定容易出錯和繁瑣。


查看完整回答
反對 回復 2021-12-27
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

其實是有辦法的。但讓我們先弄清楚一些事情。


在常量聲明中,如果類型存在,則常量將采用指定的類型:


const n int64 = 3 // n will be a typed constant, its type will be int64

如果省略類型,則常量將采用表達式的類型:


const x = int16(3) // x will be a typed constant, its type will be int16

如果表達式是無類型常量,則聲明的常量將保持無類型常量:


const i = 1 // i will be an untyped integer constant

請注意,如果您嘗試打印i的類型(例如 with fmt.Printf("%T", i),您將看到int,那是因為在將常量傳遞給函數或將其分配給變量時,必須將其轉換為實際類型,并且默認類型將被使用(因為fmt.Println()參數類型為interface{}) - 這是int一個無類型的整數常量。


在帶括號的const聲明列表中,表達式列表可以從聲明中省略(除了第一個)。如果缺少表達式,則將使用之前的非空表達式(文本替換)。


所以當你這樣做時:


const(

    Stage1 FeeStage = iota

    Stage2 

    Stage3

)

它的意思是:


const (

    Stage1 FeeStage = iota

    Stage2 FeeStage = iota

    Stage3 FeeStage = iota

)

這導致了 3 個新常量:Stage1,Stage2和Stage3,都屬于 類型FreeStage。


你的第二個例子:


const (

    Stage1 FeeStage = iota           // 0

    Stage2          = iota + 6       // 7

    Stage3          = (iota - 3) * 5 // -5

)

由于您沒有省略表達式,因此只有您的第一個常量Stage1是類型化常量( type FreeStage),其余的將是無類型常量!所以這甚至不符合條件(不符合您的要求)!


現在說到你的觀點:你想要這樣的東西:


const(

    Stage1 FeeStage = 1

    Stage2          = 2

    Stage3          = 2

)

如上所述,如果你離開了型,Stage2而Stage3將非類型化常量。因此必須指定類型,您可以利用 const 規范是這樣的事實:


ConstSpec      = IdentifierList [ [ Type ] "=" ExpressionList ] .

您可以指定一個標識符列表:


const(

    Stage1, Stage2, Stage3 FeeStage = 1, 2, 2

)

這是否更具可讀性?也許如果只有幾個常量。如果有很多,使用 Not_a_Golfer 的推薦:


const(

    Stage1 FeeStage = 1

    Stage2 FeeStage = 2

    Stage3 FeeStage = 2

)


查看完整回答
反對 回復 2021-12-27
  • 3 回答
  • 0 關注
  • 261 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號