真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Golang中如何實(shí)現(xiàn)枚舉

這篇文章主要介紹了Golang中如何實(shí)現(xiàn)枚舉的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Golang中如何實(shí)現(xiàn)枚舉文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

我們一直強(qiáng)調(diào)成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)對(duì)于企業(yè)的重要性,如果您也覺(jué)得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過(guò)程中的有力推手。專業(yè)網(wǎng)站設(shè)計(jì)公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。

Golang中如何實(shí)現(xiàn)枚舉

在編程領(lǐng)域里,枚舉用來(lái)表示只包含有限數(shù)量的固定值的類型,在開(kāi)發(fā)中一般用于標(biāo)識(shí)錯(cuò)誤碼或者狀態(tài)機(jī)。拿一個(gè)實(shí)體對(duì)象的狀態(tài)機(jī)來(lái)說(shuō),它通常與這個(gè)對(duì)象在數(shù)據(jù)庫(kù)里對(duì)應(yīng)記錄的標(biāo)識(shí)狀態(tài)的字段值相對(duì)應(yīng)。

if (article.state == 2) {
   // state 2 代表文章已發(fā)布
}

假如我們的代碼里沒(méi)有注釋,或者等我們項(xiàng)目的代碼里充斥著這些魔術(shù)數(shù)字的判斷的時(shí)候,你是不是會(huì)很頭疼?

后來(lái)我就學(xué)會(huì)了把這些狀態(tài)值定義成常量,并且也搞一個(gè)判斷對(duì)象狀態(tài)的方法單獨(dú)封裝這段邏輯。

public class ArticleState {
    
    public static final int Draft = 1; //草稿
    
    public static final int Published = 2; //發(fā)布
    
    public static final int Deleted = 3; // 已刪除
}

public  Boolean checkArticleState(int state) {
    
    ...
    
}

這種用法,肯定是比在程序里直接用魔術(shù)數(shù)字進(jìn)行判斷要強(qiáng)很多啦,至少看著不會(huì)很頭疼,不會(huì)想罵**。

不過(guò)后來(lái)被當(dāng)時(shí)帶我的老大哥說(shuō)這種也有缺點(diǎn),上面這個(gè) checkArticleState 方法用來(lái)檢查文章?tīng)顟B(tài),本意是讓調(diào)用者傳入 ArticleState 的三個(gè)靜態(tài)常量之一,但由于沒(méi)有類型上的約束,因此傳入任意一個(gè) int 值在語(yǔ)法上也是允許的,編譯器也不會(huì)提出任何警告,用枚舉更合適一些。

em~! 我不記得大學(xué)教 Java 的那個(gè)學(xué)期老師講過(guò)這玩意啊,莫非又是一個(gè)上課玩手機(jī)錯(cuò)過(guò)的知識(shí)點(diǎn)?所以使用枚舉后我們的Java代碼變成了:

// 使用enum而非class聲明
public enum ArticleState {
	
    //要在enum里創(chuàng)建所有的枚舉對(duì)象
    Draft(1, "草稿");
    Published(2, "已發(fā)布");
    Deleted(3, "已刪除")
      
    // 自定義屬性
    private int code;

    private String text;
  
    // 構(gòu)造方法必須是private的
    ArticleState(int code, String text) {
        this.code = id;
        this.text = name;
    }
}

public  Boolean checkArticleState(ArticleState state) {
    
    ...
    
}

這樣就能靠形參的枚舉類型幫我們過(guò)濾掉非法的狀態(tài)值,把整型值作為參數(shù)傳給 checkArticleState 方法時(shí)因?yàn)轭愋筒黄ヅ渚幾g不過(guò)去,在寫(xiě)代碼是編譯器也能馬上提示出來(lái)。

如果沒(méi)有用過(guò) Java 的小伙伴也不用糾結(jié),主要語(yǔ)法點(diǎn)我用注釋標(biāo)注出來(lái)了,大家應(yīng)該都能看懂。

后來(lái)這兩年主要在用Go做項(xiàng)目,我發(fā)現(xiàn)相似的問(wèn)題 Go 里存在,但是 Go 并沒(méi)有提供枚舉類型,那怎么做到進(jìn)行狀態(tài)值的正確限制呢?如果還是用 int 型的常量肯定不行。比如:

 const (
     Draft int = 1
     Published = 2
     Deleted   = 3
 )

 const (
     Summer int = 1
     Autumn     = 2
     Winter     = 3
     Spring     = 4
 )

 func main() {
     // 輸出 true, 不會(huì)有任何編譯錯(cuò)誤
     fmt.Println(Autumn == Draft)
 }

比如上面定義了兩組 int 類型的常量,一類代表文章?tīng)顟B(tài),一類代表季節(jié)的四季。這種方式拿文章?tīng)顟B(tài)與季節(jié)進(jìn)行比較不會(huì)有任何編譯上的錯(cuò)誤。

答案在 Go 內(nèi)置庫(kù)或者一些咱們都知道的開(kāi)源庫(kù)的代碼里就能找到。比如看看 google.golang.org/grpc/codes 里的gRPC 的錯(cuò)誤碼是怎么定義的,就能明白該怎么正確的實(shí)現(xiàn)枚舉。

我們可以用 int 作為基礎(chǔ)類型創(chuàng)建一個(gè)別名類型,Go 里邊是支持這個(gè)的

type Season int

const (
	Summer Season = 1
	Autumn        = 2
	Winter        = 3
	Spring        = 4
)

當(dāng)然定義連續(xù)的常量值的時(shí)候 Go 里邊經(jīng)常使用 iota,所以上面的定義還能進(jìn)一步簡(jiǎn)化。

type Season int

const (
	Summer Season = iota + 1
	Autumn
	Winter
	Spring
)

type ArticleState int

const (
  Draft int = iota + 1
  Published
  Deleted  
)

func checkArticleState(state ArticleState) bool {
	// ... 
}

 func main() {
   // 兩個(gè)操作數(shù)類型不匹配,編譯錯(cuò)誤
   fmt.Println(Autumn == Draft)
	// 參數(shù)類型不匹配,但是因?yàn)?nbsp;ArticleState 底層的類型是 int 所以傳遞 int 的時(shí)候會(huì)發(fā)生隱式類型轉(zhuǎn)換,所以不會(huì)報(bào)錯(cuò)
   checkArticleState(100)
 }

雖然這些狀態(tài)值的底層的類型都是 int 值,但是現(xiàn)在進(jìn)行兩個(gè)不相干類型的枚舉值比較,會(huì)造成編譯錯(cuò)誤,因?yàn)楝F(xiàn)在我們使用狀態(tài)值的地方都有了類型限制。

不過(guò)函數(shù) checkArticleState 的參數(shù)類型設(shè)置成了 ArticleState 但是因?yàn)?ArticleState 底層的類型是 int 。所以調(diào)用 checkArticleState  時(shí)傳遞 int 類型的參數(shù)會(huì)發(fā)生隱式類型轉(zhuǎn)換,不會(huì)造成編譯報(bào)錯(cuò),這塊如果想解決,只能重新定義類型來(lái)實(shí)現(xiàn)了。

關(guān)于“Golang中如何實(shí)現(xiàn)枚舉”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Golang中如何實(shí)現(xiàn)枚舉”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享題目:Golang中如何實(shí)現(xiàn)枚舉
轉(zhuǎn)載來(lái)源:http://weahome.cn/article/gsopio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部