什麼是枚舉?
枚舉(enumeration)的縮寫,是一種特殊的資料類型,表示一組命名值。它用於定義概念上相關的常數值的集合,提高程式碼可讀性並減少因使用任意文字值而導致的錯誤。
// Enum in Java enum TrafficLight { RED, YELLOW, GREEN }
# Enum in Python from enum import Enum class TrafficLight(Enum): RED = 1 GREEN = 2 BLUE = 3
Go 中的列舉
Go 本身不支援枚舉。然而,在 Go 中定義枚舉的流行方法是使用 iota 方法。
package main type TrafficLight int const ( RED TrafficLight = iota // 0 GREEN // 1 BLUE // 2 ) func main() { fmt.Println(RED) // Output: 0 }
但是,以這種方式處理枚舉時存在一些問題:
- 缺乏內建方法:不直接支援列出所有枚舉值或在字串和枚舉之間轉換等功能。
- 有限型別安全:枚舉通常使用基本型別(例如 int 或 string)表示,這會增加意外分配的風險。
- 序列化和反序列化複雜性:將枚舉映射到 JSON 等格式或從 JSON 等格式映射需要額外的處理。
xybor-x/enum 庫
xybor-x/enum 函式庫為 Go 枚舉提供了優雅、易於使用且功能強大的解決方案,無需產生程式碼。
有一些類型的枚舉可以與 xybor-x/enum 一起使用,請選擇最合適的一種。
基本上枚舉
優點?
- 簡單。
- 支援常數值。
缺點?
- 沒有內建方法。
- 沒有型別安全。
- 缺乏序列化和反序列化支持。 與傳統枚舉一樣,基本枚舉沒有內建方法。但是您可以使用 xybor-x/enum 的實用函數來處理這種類型的枚舉。
package main type Role int const ( RoleUser Role = iota RoleAdmin ) func init() { enum.Map(RoleUser, "user") enum.Map(RoleAdmin, "admin") // Optional: ensure no new enum values can be added to Role. enum.Finalize[Role]() } func main() { // Print the corresponding string. fmt.Println(enum.ToString(RoleUser)) // Output: user // Print out all valid enums. fmt.Println(enum.All[Role]()) // Output: [0 1] // Parse an enum from int. r1, ok := enum.FromInt[Role](1) fmt.Println(ok) // Output: true fmt.Println(enum.ToString(r1)) // Output: admin // Parse an enum from string. r2, ok := enum.FromString[Role]("admin") fmt.Println(ok) // Output: true fmt.Println(r2) // Output: 1 // Serialize json. data, err := enum.MarshalJSON(RoleUser) fmt.Println(err) // Output: nil fmt.Println(string(data)) // Output: "user" }
包裹枚舉
優點?
- 支援常數值。
- 提供了許多有用的內建方法。
- 開箱即用的完整序列化和反序列化支援。
缺點?
- 僅提供基本型別安全。
package main // Only need to change the two following lines fromthe Basic enum. type role any type Role = enum.WrapEnum[role] const ( RoleUser Role = iota RoleAdmin ) func init() { enum.Map(RoleUser, "user") enum.Map(RoleAdmin, "admin") // Optional: ensure no new enum values can be added to Role. enum.Finalize[Role]() } func main() { // Print the corresponding string. No need to use enum.ToString. fmt.Println(RoleUser) // Output: user // Print out all valid enums. fmt.Println(enum.All[Role]()) // Output: [user admin] // Parse an enum from int. r1, ok := enum.FromInt[Role](1) fmt.Println(ok) // Output: true fmt.Println(r1) // Output: admin // Parse an enum from string. r2, ok := enum.FromString[Role]("admin") fmt.Println(ok) // Output: true fmt.Println(r2) // Output: admin // Now you can use json.Marshal instead of enum.MarshalJSON. data, err := json.Marshal(RoleUser) fmt.Println(err) // Output: nil fmt.Println(string(data)) // Output: "user" }
WrapEnum 是最適合一般情況的枚舉。然而,它只提供基本的類型安全。如果您想要更嚴格的,請考慮使用 SafeEnum。
// WrapEnum cannot prevent this type of invalid declaration. // Consider using SafeEnum. r := Role(42)
安全枚舉
SafeEnum 定義了一個強型別型安全枚舉。與 WrapEnum 一樣,它提供了一組內建方法來簡化枚舉的使用。
SafeEnum 強制執行嚴格的型別安全,確保只允許預先定義的枚舉值。它可以防止意外創建新的枚舉類型,從而提供一組保證的有效值。
優點?
- 提供強大的類型安全性。
- 提供了許多有用的內建方法。
- 開箱即用的完整序列化和反序列化支援。
缺點?
- 不支援常數值。
為什麼持續支持很重要?
一些靜態分析工具(例如 bazel 的 nogo、具有詳盡擴展的 golangci-lint)支援檢查常數枚舉中的詳盡 switch 語句。透過選擇具有持續支援的枚舉,您可以在這些工具中啟用此功能。
// Enum in Java enum TrafficLight { RED, YELLOW, GREEN }
參考
xybor-x/enum:https://github.com/xybor-x/enum
中:https://medium.com/@huykingsofm/enum-handling-in-go-a2727154435e
越南語 viblo:https://viblo.asia/p/cac-van-de-cua-go-enum-va-cach-giai-quyet-voi-xybor-xenum-Yym401A9J91
以上是Go Enum 與 xybor-x/enum 的問題及解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Go的"strings"包提供了豐富的功能,使字符串操作高效且簡單。 1)使用strings.Contains()檢查子串。 2)strings.Split()可用於解析數據,但需謹慎使用以避免性能問題。 3)strings.Join()適用於格式化字符串,但對小數據集,循環使用 =更有效。 4)對於大字符串,使用strings.Builder構建字符串更高效。

Go語言使用"strings"包進行字符串操作。 1)拼接字符串使用strings.Join函數。 2)查找子串使用strings.Contains函數。 3)替換字符串使用strings.Replace函數,這些函數高效且易用,適用於各種字符串處理任務。

資助bytespackageingoisesential foreffited byteSemanipulation,uperingFunctionsLikeContains,index,andReplaceForsearchingangingAndModifyingBinaryData.itenHancesperformanceNandCoderAceAnibility,MakeitiTavitalToolToolToolToolToolToolToolToolToolForhandLingBinaryData,networkProtocols,networkProtocoLss,networkProtocols,andetFilei

Go語言使用"encoding/binary"包進行二進制編碼與解碼。 1)該包提供binary.Write和binary.Read函數,用於數據的寫入和讀取。 2)需要注意選擇正確的字節序(如BigEndian或LittleEndian)。 3)數據對齊和錯誤處理也是關鍵,確保數據的正確性和性能。

1)usebybytes.joinforconcatenatinges,2)bytes.bufferforincrementalwriting,3)bytes.indexorbytes.indexorbytes.indexbyteforsearching bytes.bytes.readereforrednorederencretingnchunknunknchunknunk.sss.inc.softes.4)

theencoding/binarypackageingoiseforporptimizingBinaryBinaryOperationsDuetoitssupportforendiannessessandefficityDatahandling.toenhancePerformance:1)usebinary.nativeendiandiandiandiandiandiandiandian nessideendian toavoid avoidByteByteswapping.2)

Go的bytes包主要用於高效處理字節切片。 1)使用bytes.Buffer可以高效進行字符串拼接,避免不必要的內存分配。 2)bytes.Equal函數用於快速比較字節切片。 3)bytes.Index、bytes.Split和bytes.ReplaceAll函數可用於搜索和操作字節切片,但需注意性能問題。

字節包提供了多種功能來高效處理字節切片。 1)使用bytes.Contains檢查字節序列。 2)用bytes.Split分割字節切片。 3)通過bytes.Replace替換字節序列。 4)用bytes.Join連接多個字節切片。 5)利用bytes.Buffer構建數據。 6)結合bytes.Map進行錯誤處理和數據驗證。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境