下面由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.
當一個變數(尤其是方法參數) 只能從一小部分可能的值中取出一個時,理應使用枚舉。 例如類型常數(合約狀態:永久、臨時工、學徒), 或在做任務程序時,是立即執行還是延遲執行的標記。
如果使用列舉而不是整形,則會增加編譯時的檢查,避免錯誤無效值的傳入,記錄哪些值是合法使用的。
如何實作列舉
是 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
後跳過一個數字,才是
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}
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}
例如,上面這些我完全可以用
stringpackage 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 "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])
}</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 }
以上是iota在Go怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!