首頁 > 後端開發 > Golang > 掌握 Go 中的 ENUM

掌握 Go 中的 ENUM

Patricia Arquette
發布: 2024-11-27 07:09:15
原創
385 人瀏覽過

Mastering ENUMs in Go

通常,在我們開發的系統中,我們會遇到恆定的值。這些值的一個範例可以是註冊狀態的表示。在這種情況下,請考慮包含活動和非活動以外的更多變化的狀態。

如果這些狀態被定義為字串,它們在系統內的驗證可能會成為一個令人頭痛的問題。此外,這種方法可能會「膨脹」二進位文件,因為每次驗證都會涉及兩個字串(預期值和正在驗證的值)。

為了避免這些問題,我們可以使用眾所周知的枚舉類型。如果您不熟悉這種類型,它本質上是固定或有限大小的類型。

為了讓它更清楚,讓我們深入研究一些程式碼。按照前面提出的想法,我們將建立一個枚舉類型來驗證註冊狀態。

定義新類型

基於 Go 的標準類型建立枚舉可能會出現問題。讓我解釋一下。假設我們將狀態定義為 uint8 類型。現在,假設我們的系統還有另一個用於流派的 uint8 類型的枚舉。

現在想像一下數值 1 代表待處理狀態和鄉村音樂流派。如果執行 if Pending == Country 驗證會發生什麼?沒錯,它會回傳true。

為了防止這種情況,我們將建立一個專門用於處理狀態的新類型。這個類型將基於 uint8,但由於它是一個不同的類型,前面提到的驗證不會傳回 true。

type Status uint8
登入後複製

創建枚舉

定義新類型後,讓我們為註冊狀態建立常數及其對應的值。

const (
  Created Status = 0
  Pending = 1
  Approved = 2
  Rejected = 3
)
登入後複製

雖然像我們上面那樣分配值本身並沒有什麼錯誤,但還有一種更簡單的方法。我們可以使用 iota 關鍵字,而不是為每個常數賦值。此關鍵字使 Go 將 0 分配給第一個常數,然後為每個後續常數依序將值加 1。

const (
  Created Status = iota
  Pending
  Approved
  Rejected
)
登入後複製

列印枚舉

由於目前實作了枚舉,列印常數 Created 將顯示值 0。但是,為了更好的可讀性,顯示單字 Created 而不是值 0 更有幫助。

解決方案非常簡單。只需實作神奇的 String() 方法即可。

func (s Status) String() string {
  switch s {
    case Created:
      return "created"
    case Pending:
      return "pending"
    case Approved:
      return "approved"
    case Rejected:
      return "rejected"
   }

   return "unknown"
}
登入後複製

結論

為了測試這一點,讓我們簡單列印一下 Pending 狀態。

package main

import "fmt"

type Status uint8

const (
  Created Status = iota
  Pending
  Approved
  Rejected
)

func (s Status) String() string {
  switch s {
    case Created:
      return "created"
    case Pending:
      return "pending"
    case Approved:
      return "approved"
    case Rejected:
      return "rejected"
  }

  return "unknown"
}

func main() {
  fmt.Println(Pending)
}
登入後複製

執行指令 go run 應該在終端機上輸出掛起。

就是這樣!我希望這對您有幫助。

下次見!

以上是掌握 Go 中的 ENUM的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板