1. 程式人生 > 其它 >Go 常量定義

Go 常量定義

定義常量在各個語言中都是不可或缺的語法了. 而有些語言在常量的基礎上, 增加了列舉型別, 比如C.

enum Weekday {
        SUNDAY,
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY
};

上面的列舉, 對應的值依次為0到6.

而在Go中, 是沒有提供列舉型別的. 如果實現上面相同的功能, 難道要寫成這樣麼?

const (
	SUNDAY = 0
	MONDAY = 1
	TUESDAY = 2
	WEDNESDAY = 3
	THURSDAY = 4
	FRIDAY = 5
	SATURDAY = 6
)

不過仔細想象, Go的開發者之一就是開發C語言的前輩, 怎麼能不繼承這麼漂亮的語法呢?

Go在常量定義上實現了兩個特殊的特性:

  1. 若一個常量沒有賦值, 則預設為重複上一行
  2. iota 神器

分別介紹一下這兩個傢伙.

常量的預設值

當一個常量沒有明確給出值的時候, 則常量預設重複上一行賦值的行為. 比如:

const (
	a    = 1
	b    // 1
	c    = 2
	d    // 2
	e, f = 3, 4
	g, h // 3,4
	i    // 報錯, 因為前一行賦值為 3,4. 無法重複
)

包括如果上一個指定了型別, 下面的也會跟著指定.

iota

為當前常量塊的索引值(行號), 從0開始. 對常量塊的定義, 表示包在 const() 中的常量定義. 比如:

const s = iota // 0
const o = iota // 0
const (
	a    = iota       // 0
	b                 // 1
	c                 // 2
	d, e = iota, iota // 3, 3
	f, g              // 4, 4
)

在常量定義中, iota 是可以參與運算的哦.

使用

一下舉幾個我想到的例子, 通過組合上面的特性, 通常還是能夠有不錯的效果的.

1. 定義二進位制標識位

const (
	isA = 1 << iota // 0b1
	isB // 0b10
	isC // 0b100
	isD // 0b1000
)

2.丟棄及重複使用 iota

當需要索引從1開始時, 可以將第一行丟掉.

const (
	_ = iota // 丟棄0
	a // 1
	b // 2
	_ // 丟棄3
	c,d = iota,iota // 4,4 重複使用
)

3.數值型運算

上面都比較簡單, 想了幾個玩的比較花的. 來瞅瞅.

const (
	P   = 3.1415926      // 定義π
	P_2 = P / (2 * iota) // P/2
	P_4                  // P/4
	P_6                  // P/6
	P_8                  // P/8
)
const (
	P    = 3.1415926       // π
	P_2  = P / (1 << iota) // P/2
	P_4                    // P/4
	P_8                    // P/8
	P_16                   // P/16
)
const (
	P          = 3.1415926                       // 排
	P_2, P_M_2 = P / (1 << iota), P * (iota + 1) // P/2 P*2
	P_4, P_M_3                                   // P/4 P*3
	P_8, P_M_4                                   // P/8 P*4
)

4.計算容量單位大小

const (
	_  = 1 << (10 * iota) // 索引為0的資料不要了
	KB                    // 2^10
	MB                    // 2^20
	GB                    // 2^30
	TB                    // 2^40 下同
	PB
	EB
	ZB
	YB
)

OK, Go的常量定義基本也就這些了, 如果沒有iota, 那麼重複上一行行為也沒有太大意義了, 畢竟定義幾個相同值的常量有什麼用呢? 將這兩個特性想結合之後, 往往能夠實現很不錯的效果.