首頁 > 後端開發 > Golang > iota在Go怎麼使用

iota在Go怎麼使用

藏色散人
發布: 2021-04-29 11:53:37
轉載
2145 人瀏覽過

下面由golang教學欄位來介紹iota在Go中怎麼使用,希望對需要的朋友有幫助!

介紹

Go 語言其實沒有直接支援枚舉的關鍵字。一般我們都是透過 const iota 實現枚舉的能力。

有人要問了,為什麼一定要使用枚舉呢? stackoverflow 上有一個高讚的回答,如下:

You should always use enums when a variable (especially a method parameter) can only take one out of a small set of possible values. Examples would be things like type constants (contract status: “permanent”, “temp”, “apprentice”), or flags (“execute now”, “defer execution”). If you use enums instead of insteador (oror String codes), you increase compile-time checking and avoid errors from passing in invalid constants, and you document which values are legal to use.BTW, overuse of enums might mean that your methods doo setate tos methods, rather than one method that takes several flags which modify what it does), but if you have to use flags or type codes, enums are the way to go.


'很重要。

當一個變數(尤其是方法參數) 只能從一小部分可能的值中取出一個時,理應使用枚舉。 例如類型常數(合約狀態:永久、臨時工、學徒), 或在做任務程序時,是立即執行還是延遲執行的標記。 如果使用列舉而不是整形,則會增加編譯時的檢查,避免錯誤無效值的傳入,記錄哪些值是合法使用的。 如何實作列舉

iota

是 Go 中預先宣告的一個特殊常數。它會被預先宣告為0,但是它的值在編譯階段並非是固定的,當預宣告的iota 出現在一個常數宣告中的時候,它的值在第n個常數描述中的值為n(從0開始)。所以它只在同類型多個常數聲明的情況下才顯得有意義。

例如,大家都了解的電商,訂單系統一定會牽涉到訂單狀態的流轉。那麼這時候,我們一般可以這樣做:

package mainimport "fmt"type OrderStatus intconst (
  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 mainimport "fmt"type OrderStatus intconst (
  Cancelled OrderStatus = iota //订单已取消 0  NoPay //未支付 1  PendIng // 未发货 2  Delivered // 已发货 3  Received // 已收货 4)func main() {
  fmt.Println(Cancelled, NoPay) // 打印:0,1}
登入後複製

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

package mainimport "fmt"type OrderStatus intconst (
  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 mainimport "fmt"type OrderStatus intconst (
      Cancelled OrderStatus = iota+1 //订单已取消 1
      NoPay //未支付 2  PendIng // 未发货 3  Delivered // 已发货 4  _
     Received // 已收货 6)func main() {
      fmt.Println(Received) // 打印:6}
    登入後複製
  • 順著來可以,倒著當然也行。
  • package mainimport "fmt"type OrderStatus intconst (
      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])
}
登入後複製

或直接定義整形常數值。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">package main import &quot;fmt&quot; const ( Cancelled = 1 NoPay = 2 PendIng = 3 Delivered = 4 Received = 5) var OrderStatusMsg = map[int]string{ Cancelled: &quot;订单已取消&quot;, NoPay: &quot;未付款&quot;, PendIng: &quot;未发货&quot;, Delivered: &quot;已发货&quot;, Received: &quot;已收货&quot;, } func main() { fmt.Println(OrderStatusMsg[Cancelled]) }</pre><div class="contentsignin">登入後複製</div></div>其實上述兩種都可以,但相較之下使用 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### 的使用介紹,以及我們為什麼要使用它。 ######不知道大家平常對於這類場景是用的什麼招數,歡迎下方留言交流。 ###              ###                             ####################)

以上是iota在Go怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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