溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Go語(yǔ)言中怎么實(shí)現(xiàn)枚舉類(lèi)型

發(fā)布時(shí)間:2023-04-18 10:07:15 來(lái)源:億速云 閱讀:136 作者:iii 欄目:開(kāi)發(fā)技術(shù)

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

    前言

    枚舉類(lèi)型是一種常用的數(shù)據(jù)類(lèi)型,用于表示一組有限的、預(yù)定義的、具名的常量值。在枚舉類(lèi)型中,每個(gè)常量都是一個(gè)枚舉值,它們之間的值相等且唯一。

    枚舉類(lèi)型通常用于表示一組相關(guān)的常量,比如星期、月份、性別等等。在其他語(yǔ)言里(比如 JavaC),都內(nèi)置了枚舉類(lèi)型,而在 Go 語(yǔ)言里是沒(méi)有內(nèi)置枚舉類(lèi)型的,因此我們需要采用其他方式實(shí)現(xiàn)類(lèi)似的枚舉類(lèi)型功能。

    Go 語(yǔ)言中的 “枚舉類(lèi)型”

    枚舉類(lèi)型的值本質(zhì)上是常量,因此我們可以使用 Go 語(yǔ)言中的常量來(lái)實(shí)現(xiàn)類(lèi)似枚舉類(lèi)型的功能,例如:

    const (
       Sunday    = 1
       Tuesday   = 2
       Wednesday = 3
       Thursday  = 4
       Friday    = 5
       Saturday  = 6
       Monday    = 7
    )

    在這個(gè)例子中,我們使用了 const 關(guān)鍵字定義了一組常量,其中每個(gè)常量的名稱(chēng)代表著一個(gè)枚舉,其值為對(duì)應(yīng)的整數(shù)。

    雖然這個(gè)例子能實(shí)現(xiàn)類(lèi)似的枚舉類(lèi)型,但它不具備枚舉類(lèi)型的所有特征,例如缺少安全性和約束性,為了解決這兩個(gè)問(wèn)題,我們可以使用自定義類(lèi)型進(jìn)行改進(jìn):

    type WeekDay int
    
    const (
       Sunday    WeekDay = 1
       Tuesday   WeekDay = 2
       Wednesday WeekDay = 3
       Thursday  WeekDay = 4
       Friday    WeekDay = 5
       Saturday  WeekDay = 6
       Monday    WeekDay = 7
    )

    在改進(jìn)后的例子中,我們定義了一個(gè)自定義類(lèi)型 Weekday,用于表示星期幾。使用 const 關(guān)鍵字定義一個(gè)常量組,其中每個(gè)常量都被賦予了一個(gè)具體的值,同時(shí)使用 Weekday 類(lèi)型進(jìn)行類(lèi)型約束和類(lèi)型檢查。這樣,我們就可以通過(guò)枚舉值的名稱(chēng)來(lái)表示某個(gè)特定的星期幾,并且由于使用了自定義類(lèi)型,編譯器可以進(jìn)行類(lèi)型檢查,從而提高了類(lèi)型安全性。

    使用 itoa 優(yōu)雅實(shí)現(xiàn)枚舉

    通過(guò)前面的例子不難發(fā)現(xiàn),當(dāng)我們需要定義多個(gè)枚舉值時(shí),手動(dòng)指定每個(gè)枚舉常量的值會(huì)變得十分麻煩。為了解決這個(gè)問(wèn)題,我們可以使用 iota 常量生成器,它可以幫助我們生成連續(xù)的整數(shù)值。

    例如,使用 iota 定義一個(gè)星期幾的枚舉類(lèi)型:

    type WeekDay int
    
    const (
       Sunday WeekDay = iota
       Tuesday
       Wednesday
       Thursday
       Friday
       Saturday
       Monday
    )

    在這個(gè)例子中,我們使用 iota 自增常量生成器來(lái)定義了一個(gè)星期幾的枚舉類(lèi)型,每個(gè)枚舉值都是一個(gè) Weekday 類(lèi)型的常量。由于 iota 的自增規(guī)則,每個(gè)枚舉值的值將自動(dòng)遞增,從而生成一系列連續(xù)的整數(shù)值。

    為自定義的枚舉添加方法

    type WeekDay int
    
    const (
       Sunday WeekDay = iota
       Tuesday
       Wednesday
       Thursday
       Friday
       Saturday
       Monday
    )

    為了能讓我們實(shí)現(xiàn)的 “枚舉類(lèi)型” 更加具備枚舉類(lèi)型的特征,我們可以為其添加類(lèi)似 Java 等其他語(yǔ)言中的枚舉方法。

    Name()

    返回枚舉值的名稱(chēng)。

    // Name 返回枚舉值的名稱(chēng)
    func (w WeekDay) Name() string {
       if w < Sunday || w > Monday {
          return "Unknown"
       }
       return [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}[w]
    }

    Original

    返回枚舉值在枚舉類(lèi)型中的位置。

    // Original 由于這個(gè)枚舉類(lèi)型的枚舉值本質(zhì)上是整數(shù)常量,因此我們可以直接使用枚舉值作為它的序號(hào)
    func (w WeekDay) Original() int {
       return int(w)
    }

    String()

    實(shí)現(xiàn) String 方法,用于打印輸出。

    // 將枚舉值轉(zhuǎn)成字符串,便于輸出
    func (w WeekDay) String() string {
       return w.Name()
    }

    Values()

    返回一個(gè)包含所有枚舉值的切片。

    // Values 返回一個(gè)包含所有枚舉值的切片
    func Values() []WeekDay {
       return []WeekDay{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}
    }

    ValueOf()

    根據(jù)名稱(chēng)返回對(duì)應(yīng)的枚舉值。

    // ValueOf 使用 switch 語(yǔ)句來(lái)根據(jù)名稱(chēng)返回對(duì)應(yīng)的枚舉值
    func ValueOf(name string) (WeekDay, error) {
       switch name {
       case "Sunday":
          return Sunday, nil
       case "Monday":
          return Monday, nil
       case "Tuesday":
          return Tuesday, nil
       case "Wednesday":
          return Wednesday, nil
       case "Thursday":
          return Thursday, nil
       case "Friday":
          return Friday, nil
       case "Saturday":
          return Saturday, nil
       default:
          return 0, fmt.Errorf("invalid WeekDay name: %s", name)
       }
    }

    關(guān)于“Go語(yǔ)言中怎么實(shí)現(xiàn)枚舉類(lèi)型”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Go語(yǔ)言中怎么實(shí)現(xiàn)枚舉類(lèi)型”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI