iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
自我挑戰組

轉職未滿一年的點點滴滴系列 第 15

[Day 15] -『 GO語言學習筆記』- 核心型別(II)

  • 分享至 

  • xImage
  •  

以下筆記摘錄自『 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

位元(Byte)

在Go語言裡面,byte型別其實就是unit8型別的別名,後者是以8個位元儲存的正整數。
每一個位元(bit)代表一個二進位值,意即開或關(1或0)。8個位元總共有256種可能的『開關』組合,而既然unit8的值是由0到255,那就可以用0到255的整數來代表256種狀態。


上一篇
[Day 14] - 『轉職工作的Lessons learned』 - Docker Build Issue
下一篇
[Day 16] -『 GO語言學習筆記』- 核心型別(III)
系列文
轉職未滿一年的點點滴滴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言