欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang表示枚舉類型的詳細(xì)講解

 更新時(shí)間:2021年09月04日 11:00:56   作者:佚名  
go 語(yǔ)言枚舉類型是這么用的?在什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語(yǔ)言枚舉做了詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧

枚舉,是一種重要的數(shù)據(jù)類型,由一組鍵值對(duì)組成,通常用來(lái)在編程語(yǔ)言中充當(dāng)常量的標(biāo)識(shí)符。在主流行編程語(yǔ)言如 c、 java 等,都有原生支持。在 go 中,大家卻找不到 enum 或者其它直接用來(lái)聲明枚舉類型的關(guān)鍵字。從熟悉其它編程語(yǔ)言的開(kāi)發(fā)者轉(zhuǎn)用 go 編程,剛開(kāi)始會(huì)比較難接受這種情況。其實(shí),如果你看到如何在 go 中表示枚舉類型時(shí),可能會(huì)感受到 go 語(yǔ)言設(shè)計(jì)者對(duì)簡(jiǎn)潔性、問(wèn)題考慮的深度,是一般資淺工程師無(wú)法比擬的。

其實(shí),在 go 語(yǔ)言設(shè)計(jì)者的眼里,enum 本質(zhì)是常量,為什么要多余一個(gè)關(guān)鍵字呢?在 go 只是沒(méi)有 enum 關(guān)鍵字而已,其表現(xiàn)枚舉的形式,與其它語(yǔ)言別無(wú)太大區(qū)別。下面來(lái)看看如果在 go 中表示枚舉。

學(xué)習(xí)、使用一門(mén)語(yǔ)言,是學(xué)習(xí)、理解語(yǔ)言本身的設(shè)計(jì)哲學(xué),同時(shí)也會(huì)感受到設(shè)計(jì)者的性格特點(diǎn)。

基礎(chǔ)工作 

為了下面講解方便,這里使用 go modules 的方式先建立一個(gè)簡(jiǎn)單工程。

~/Projects/go/examples  
➜  mkdir enum  
~/Projects/go/examples  
➜  cd enum  
~/Projects/go/examples/enum  
➜  go mod init enum  
go: creating new go.mod: module enum  
~/Projects/go/examples/enum  
➜  touch enum.go 

const + iota

以 啟動(dòng)、運(yùn)行中、停止 這三個(gè)狀態(tài)為例,使用 const 關(guān)鍵來(lái)聲明一系列的常量值。在 enum.go 中寫(xiě)上以下內(nèi)容:

package main  
import "fmt"  
const (  
    Running int = iota  
    Pending  
    Stopped  
)  
func main() {  
    fmt.Println("State running: ", Running)  
    fmt.Println("State pending: ", Pending)  
    fmt.Println("State Stoped: ", Stopped)  
} 

保存并運(yùn)行,可以得到以下結(jié)果,

~/Projects/go/examples/enum   
➜  go run enum.go  
State running:  0  
State pending:  1  
State Stoped:  2 

在說(shuō)明發(fā)生了什么之前,我們先看來(lái)一件東西,iota。相比于 c、java,go 中提供了一個(gè)常量計(jì)數(shù)器,iota,它使用在聲明常量時(shí)為常量連續(xù)賦值。

比如這個(gè)例子,

const (  
    a int = iota // a = 0  
    b int = iota // b = 1  
    c int = iota // c = 2  
)  
const d int = iota // d = 0 

在一個(gè) const 聲明塊中,iota 的初始值為 0,每聲明一個(gè)變量,自增 1。以上的代碼可以簡(jiǎn)化成:

const (  
    a int = iota // a = 0  
    b // b = 1  
    c // c = 2  
)  
const d int = iota // d = 0 

設(shè)想一下,如果此時(shí)有 50 或者 100 個(gè)常量數(shù),在 c 和 java 語(yǔ)言中寫(xiě)出來(lái)會(huì)是什么情況。

關(guān)于 iota,有更多的具體的技巧(例如跳數(shù)),詳細(xì)請(qǐng)看官方定義 iota。

通過(guò)使用 const 來(lái)定義一連串的常量,并借助 iota 常量計(jì)數(shù)器,來(lái)快速的為數(shù)值類型的常量連續(xù)賦值,非常方便。雖然沒(méi)有了 enum 關(guān)鍵字,在這種情況下發(fā)現(xiàn),是多余的,枚舉本質(zhì)上就是常量的組合。

當(dāng)然,你可以使用以下方式,來(lái)更接近其它語(yǔ)言的 enum,

// enum.go  
...  
type State int  
const (  
    Running State = iota  
    Pending  
    Stopped  
)  
... 

把一組常量值,使用一個(gè)類型別名包裹起來(lái),是不是更像其它語(yǔ)言中的 enum {} 定義了呢?

你還可以將上面的例子改為:

// enum.go  
...  
type State int 
const (  
    Running State = iota  
    Pending  
    Stopped  
)  
func (s State) String() string {  
    switch s {  
    case Running:  
        return "Running"  
    case Pending:  
        return "Pending"  
    case Stopped:  
        return "Stopped"  
    default:  
        return "Unknown" 
     }  
}  
... 

為定義的枚舉類型加上 String 函數(shù),運(yùn)行結(jié)果如下:

~/Projects/go/examples/enum   
➜  go run enum.go  
State running:  Running  
State pending:  Pending  
State Stoped:  Stopped 

是不是很魔幻,思路一下又開(kāi)闊一些,長(zhǎng)見(jiàn)識(shí)了。把實(shí)際的值與打印字符分開(kāi),一般語(yǔ)言設(shè)計(jì)者不會(huì)想到??吹竭@里,有沒(méi)有這種的感覺(jué),go 語(yǔ)言的設(shè)計(jì)者并不是偷懶,而是為了可以偷懶想了很多、做了很多。

到此這篇關(guān)于Golang表示枚舉類型的詳細(xì)講解的文章就介紹到這了,更多相關(guān)Golang 枚舉類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從零封裝Gin框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)初始化GORM

    從零封裝Gin框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)初始化GORM

    這篇文章主要為大家介紹了從零封裝Gin框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)初始化GORM,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang?Fasthttp選擇使用slice而非map?存儲(chǔ)請(qǐng)求數(shù)據(jù)原理探索

    Golang?Fasthttp選擇使用slice而非map?存儲(chǔ)請(qǐng)求數(shù)據(jù)原理探索

    本文將從簡(jiǎn)單到復(fù)雜,逐步剖析為什么?Fasthttp?選擇使用?slice?而非?map,并通過(guò)代碼示例解釋這一選擇背后高性能的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • go string to int 字符串與整數(shù)型的互換方式

    go string to int 字符串與整數(shù)型的互換方式

    這篇文章主要介紹了go string to int 字符串與整數(shù)型的互換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 詳解Golang中哪些類型可以作為map的key

    詳解Golang中哪些類型可以作為map的key

    在 Go 語(yǔ)言中,map 是一種內(nèi)置的關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)類型,由一組無(wú)序的鍵值對(duì)組成,每個(gè)鍵都是唯一的,并與一個(gè)對(duì)應(yīng)的值相關(guān)聯(lián),本文將詳細(xì)介紹哪些類型的變量可以作為 map 的鍵,并通過(guò)實(shí)例進(jìn)行說(shuō)明,感興趣的朋友可以參考下
    2024-01-01
  • 重學(xué)Go語(yǔ)言之文件操作詳解

    重學(xué)Go語(yǔ)言之文件操作詳解

    有很多場(chǎng)景都需要對(duì)文件進(jìn)行讀取或者寫(xiě)入,比如讀取配置文件或者寫(xiě)入日志文件,在Go語(yǔ)言中,操作文件應(yīng)該算是一件比較簡(jiǎn)單的事情,我們?cè)谶@一篇文章中,一起來(lái)探究一下
    2023-08-08
  • Go中Goroutines輕量級(jí)并發(fā)的特性及效率探究

    Go中Goroutines輕量級(jí)并發(fā)的特性及效率探究

    這篇文章主要為大家介紹了Go中Goroutines輕量級(jí)并發(fā)的特性及效率探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 詳解golang中的閉包與defer

    詳解golang中的閉包與defer

    閉包一個(gè)函數(shù)與其相關(guān)的引用環(huán)境組合的一個(gè)實(shí)體,其實(shí)可以理解為面向?qū)ο笾蓄愔械膶傩耘c方法,這篇文章主要介紹了golang的閉包與defer,需要的朋友可以參考下
    2022-09-09
  • Golang自定義開(kāi)發(fā)Prometheus?exporter詳解

    Golang自定義開(kāi)發(fā)Prometheus?exporter詳解

    Exporter是基于Prometheus實(shí)施的監(jiān)控系統(tǒng)中重要的組成部分,承擔(dān)數(shù)據(jù)指標(biāo)的采集工作,這篇文章主要為大家介紹了如何自定義編寫(xiě)開(kāi)發(fā)?Prometheus?exporter,感興趣的可以了解一下
    2023-06-06
  • Golang的鎖機(jī)制使用及說(shuō)明

    Golang的鎖機(jī)制使用及說(shuō)明

    這篇文章主要介紹了Golang的鎖機(jī)制使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Go中Writer和Reader接口的使用入門(mén)

    Go中Writer和Reader接口的使用入門(mén)

    本文主要介紹了Go中Writer和Reader接口的使用入門(mén),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評(píng)論