以下筆記摘錄自『 The Go Workshop 』。
如果嘗試在建立變數時,賦予一個超過型別容許上限的初始值,就會發生溢位(overflow)錯誤。以int8為例,他能容許的最大值是127。
For example,
package main
import "fmt"
func main() {
var a int8 = 128
fmt.Println(a)
}
///
Output
constant 128 overflows int8
這個問題不難修正,但真正的問題是若在建立變數後,才將他的值設超過127,這時會發生越界繞回(wraparound)現象,也就是超過最大值後重新從最小值計算。
很容易碰上越界繞回這個陷阱,因為編輯器也沒辦法攔截。
package main
import "fmt"
func main() {
var a int8 = 125
var b uint8 = 253
for i := 0; i < 5; i++ {
a++
b++
fmt.Println(i, ")", "int8", a, "uint8", b)
}
}
// Output
0 ) int8 126 uint8 254
1 ) int8 127 uint8 255
2 ) int8 -128 uint8 0
3 ) int8 -127 uint8 1
4 ) int8 -126 uint8 2
如果需要的數值超過(低於)int64與uint64,可以向套件math/big求助。
package main
import (
"fmt"
"math"
"math/big"
)
func main() {
intA := math.MaxInt64
intA = intA + 1
bigA := big.NewInt(math.MaxInt64)
bigA.Add(bigA, big.NewInt(1))
fmt.Println("MaxInt64: ", math.MaxInt64)
fmt.Println("Int :", intA)
fmt.Println("Big Int : ", bigA.String())
}
// Output
MaxInt64: 9223372036854775807 <--- int64 最大值
Int : -9223372036854775808 <--- int 發生越界繞回
Big Int : 9223372036854775808 <--- big int 正確 +1
在Go語言裡面,byte型別其實就是unit8型別的別名,後者是以8個位元儲存的正整數。
每一個位元(bit)代表一個二進位值,意即開或關(1或0)。8個位元總共有256種可能的『開關』組合,而既然unit8的值是由0到255,那就可以用0到255的整數來代表256種狀態。