中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中如何使用 Iota

發布時間:2021-07-20 15:32:16 來源:億速云 閱讀:143 作者:Leah 欄目:編程語言

這篇文章給大家介紹Golang中如何使用 Iota,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

如何實現枚舉

iota 是 Go 中預聲明的一個特殊常量。它會被預聲明為0,但是它的值在編譯階段并非是固定的,當預聲明的 iota  出現在一個常量聲明中,它的值在第n個常量描述中的值為n(從0開始)。

比如,大家都或多或少了解電商系統。其中的訂單模塊一定會涉及到訂單狀態的流轉。那么這時候,我們一般可以這樣定義:

package main  import "fmt"  type OrderStatus int  const (   Cancelled OrderStatus = iota //訂單已取消 0   NoPay OrderStatus = iota //未支付 1   PendIng OrderStatus = iota // 未發貨 2   Delivered OrderStatus = iota // 已發貨 3   Received OrderStatus = iota // 已收貨 4 )  func main() {   fmt.Println(Cancelled, NoPay) // 打印:0,1 }

當然,這樣看著好麻煩。其實,其他常量可以重復上一行 iota 表達式,我們可以改成這樣。

package main  import "fmt"  type OrderStatus int  const (   Cancelled OrderStatus = iota //訂單已取消 0   NoPay //未支付 1   PendIng // 未發貨 2   Delivered // 已發貨 3   Received // 已收貨 4 )  func main() {   fmt.Println(Cancelled, NoPay) // 打印:0,1 }

有人會用 0 的值來表示狀態嗎?一般都不會,我們想以1開頭,那么可以這樣。

package main  import "fmt"  type OrderStatus int  const (   Cancelled OrderStatus = iota+1 //訂單已取消 1   NoPay //未支付 2   PendIng // 未發貨 3   Delivered // 已發貨 4   Received // 已收貨 5 )  func main() {   fmt.Println(Cancelled, NoPay) // 打印:1,2 }

我們還想在 Delivered 后跳過一個數字,才是 Received 的值,也就是 Received=6,那么可以借助 _ 符號。

package main  import "fmt"  type OrderStatus int  const (   Cancelled OrderStatus = iota+1 //訂單已取消 1   NoPay //未支付 2   PendIng // 未發貨 3   Delivered // 已發貨 4   _   Received // 已收貨 6 )  func main() {   fmt.Println(Received) // 打印:6 }

順著來可以,倒著當然也行。

package main  import "fmt"  type OrderStatus int  const (   Max = 5 )  const (   Received OrderStatus = Max - iota // 已收貨 5   Delivered // 已發貨 4   PendIng // 未發貨 3 NoPay //未支付 2   Cancelled //訂單已取消 1 )  func main() {   fmt.Println(Received,Delivered) // 打印:5,4 }

還可以使用位運算,比如在 go 源碼中的包 sync 中的鎖上面有這么一段定義代碼。

const (     mutexLocked = 1 << iota  //1<<0     mutexWoken //1<<1     mutexStarving //1<<2     mutexWaiterShift = iota  //3  )  func main() {     fmt.Println("mutexLocked的值",mutexLocked) //打印:1     fmt.Println("mutexWoken的值",mutexWoken) //打印:2     fmt.Println("mutexStarving的值",mutexStarving) //打印:4     fmt.Println("mutexWaiterShift的值",mutexWaiterShift) // 打印:3 }

也許有人平常是直接定義常量值或者用字符串來表示的。

比如,上面這些我完全可以用 string 來表示,我還真見過用字符串來表示訂單狀態的。

package main  import "fmt"  const (   Cancelled = "cancelled"   NoPay = "noPay"   PendIng = "pendIng"   Delivered = "delivered"   Received = "received" )  var OrderStatusMsg = map[string]string{   Cancelled: "訂單已取消",   NoPay: "未付款",   PendIng: "未發貨",   Delivered: "已發貨",   Received: "已收貨", }  func main() {   fmt.Println(OrderStatusMsg[Cancelled]) }

或者直接定義整形常量值。

package main  import "fmt"  const (   Cancelled = 1   NoPay = 2   PendIng = 3   Delivered = 4   Received = 5 )  var OrderStatusMsg = map[int]string{   Cancelled: "訂單已取消",   NoPay: "未付款",   PendIng: "未發貨",   Delivered: "已發貨",   Received: "已收貨", }  func main() {   fmt.Println(OrderStatusMsg[Cancelled]) }

其實上述兩種都可以,但是相比之下使用 iota 更有優勢。

  • 能保證一組常量的唯一性,人工定義的不能保證。

  • 可以為一組動作分享同一種行為。

  • 避免無效值。

  • 提高代碼閱讀性以及維護。

延伸

按照上面我們所演示的,最后我們可以這樣操作。

package main  import (   "fmt" )  type OrderStatus int  const (   Cancelled OrderStatus = iota + 1 //訂單已取消 1   NoPay //未支付 2   PendIng // 未發貨 3   Delivered // 已發貨 4   Received // 已收貨 5 )  //公共行為 賦予類型 String() 函數,方便打印值含義 func (order OrderStatus) String() string {   return [...]string{"cancelled", "noPay", "pendIng", "delivered", "received"}[order-1] }  //創建公共行為 賦予類型 int 函數 EnumIndex() func (order OrderStatus) EnumIndex() int {   return int(order) }  func main() {   var order OrderStatus = Received   fmt.Println(order.String()) // 打印:received   fmt.Println(order.EnumIndex()) // 打印:5 }

關于Golang中如何使用 Iota就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旬阳县| 云南省| 建德市| 枣庄市| 灵宝市| 兴化市| 静宁县| 年辖:市辖区| 建水县| 舞钢市| 房产| 新竹县| 依兰县| 鹿邑县| 万山特区| 云梦县| 乌鲁木齐市| 弋阳县| 达州市| 湟源县| 鹿泉市| 万全县| 房产| 元朗区| 康马县| 蓬安县| 繁昌县| 慈溪市| 贵德县| 慈利县| 忻州市| 竹北市| 龙南县| 青海省| 武鸣县| 巴彦淖尔市| 青龙| 浦城县| 小金县| 泊头市| 红安县|