Go 常量定义
定義常量在各個語言中都是不可或缺的語法了. 而有些語言在常量的基礎上, 增加了枚舉類型, 比如C.
enum Weekday {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY };上面的枚舉, 對應的值依次為0到6.
而在Go中, 是沒有提供枚舉類型的. 如果實現上面相同的功能, 難道要寫成這樣么?
const (SUNDAY = 0MONDAY = 1TUESDAY = 2WEDNESDAY = 3THURSDAY = 4FRIDAY = 5SATURDAY = 6 )不過仔細想象, Go的開發者之一就是開發C語言的前輩, 怎么能不繼承這么漂亮的語法呢?
Go在常量定義上實現了兩個特殊的特性:
分別介紹一下這兩個家伙.
常量的默認值
當一個常量沒有明確給出值的時候, 則常量默認重復上一行賦值的行為. 比如:
const (a = 1b // 1c = 2d // 2e, f = 3, 4g, h // 3,4i // 報錯, 因為前一行賦值為 3,4. 無法重復 )包括如果上一個指定了類型, 下面的也會跟著指定.
iota
為當前常量塊的索引值(行號), 從0開始. 對常量塊的定義, 表示包在 const() 中的常量定義. 比如:
const s = iota // 0 const o = iota // 0 const (a = iota // 0b // 1c // 2d, e = iota, iota // 3, 3f, g // 4, 4 )在常量定義中, iota 是可以參與運算的哦.
使用
一下舉幾個我想到的例子, 通過組合上面的特性, 通常還是能夠有不錯的效果的.
1. 定義二進制標識位
const (isA = 1 << iota // 0b1isB // 0b10isC // 0b100isD // 0b1000 )2.丟棄及重復使用 iota
當需要索引從1開始時, 可以將第一行丟掉.
const (_ = iota // 丟棄0a // 1b // 2_ // 丟棄3c,d = iota,iota // 4,4 重復使用 )3.數值型運算
上面都比較簡單, 想了幾個玩的比較花的. 來瞅瞅.
const (P = 3.1415926 // 定義πP_2 = P / (2 * iota) // P/2P_4 // P/4P_6 // P/6P_8 // P/8 ) const (P = 3.1415926 // πP_2 = P / (1 << iota) // P/2P_4 // P/4P_8 // P/8P_16 // P/16 ) const (P = 3.1415926 // 排P_2, P_M_2 = P / (1 << iota), P * (iota + 1) // P/2 P*2P_4, P_M_3 // P/4 P*3P_8, P_M_4 // P/8 P*4 )4.計算容量單位大小
const (_ = 1 << (10 * iota) // 索引為0的數據不要了KB // 2^10MB // 2^20GB // 2^30TB // 2^40 下同PBEBZBYB )OK, Go的常量定義基本也就這些了, 如果沒有iota, 那么重復上一行行為也沒有太大意義了, 畢竟定義幾個相同值的常量有什么用呢? 將這兩個特性想結合之后, 往往能夠實現很不錯的效果.
總結
- 上一篇: 23种设计模式之建造者模式
- 下一篇: 三次握手wireshark抓包分析,成功