iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

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

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

  • 分享至 

  • xImage
  •  

以下筆記摘錄自『 The Go Workshop 』。

前言

Go語言是強型別(strongly typed)語言,意即所有的資料都必須屬於某個型別,而且這個型別是固定的、無法變更的。對資料可做或不可做的事,都取決於資料的型別。

像Python, Javascript等語言其變數可以隨意變換型別,所以被稱為弱型別(weakly typed)語言。另一種分法是『靜態型別』(statically typed)與『動態型別』(dynamically typed):前者在編譯時檢查型別,後者則在執行階段才檢查型別。

型別定義

  • 能儲存何種資料
  • 能對他進行何種操作
  • 操作會對資料做什麼
  • 會佔用多少記憶體

布林值(true/false)

真與偽這兩個邏輯值都屬於布林(boolean),Go語言寫成bool。當程式碼需要非黑即白的判斷式時就可以使用。

For example,

package main

import "fmt"

func main() {
	fmt.Println(10 > 5)
	fmt.Println(10 == 5)
}
// Output
true
false

數字

Go語言中有兩種數:整數(integers)和浮點數(floating-point numbers)。

整數

分成兩種,可以儲存負值的型別稱為有號整數(signed number),無法存負值的型別稱為無號整數(unsigned number),每一種可儲存的最小和最大值都取決於型別的內部儲存容量有幾個位元組。

  • 無號整數

https://ithelp.ithome.com.tw/upload/images/20210927/20140071y10qnrWmyQ.png

  • 帶號整數

https://ithelp.ithome.com.tw/upload/images/20210927/20140071Zc22ryG9NT.png
(圖片參考)

byte是unit8的別稱,rune是unit32的別稱

特殊的整數型別,unit - 無號32或64位元整數,int - 有號32或64位元整數。長度是32還是64取決元在哪一種位元系統編譯程式。在64位元系統上,int型別和int64的整數範圍就會完全一樣,但Go將他們視為兩種不同的型別。


int能完成大部分的工作,只有當int會造成問題時,才考慮其他型別。與int有關的問題,多半都跟記憶體用量有關。
假設某個應用程式把記憶體耗光了,因為宣告了大量整數,但這些數字永遠是正整數、也未超過255,此時可能的解法是把型別從int改成unit8,這樣可以把每個數字佔用的記憶體從64位元小少到8位元


一開始使用int來處理整數是OK的,等到它造成性能問題時再來考慮更換型別。

浮點數

Go語言有兩種浮點數型別,float32:用32個位元來儲存數值,與float64:用64個位元來儲存數值,float64容量較大,精確度也較高,需要在精確度與儲存空間做出取捨。

package main

import "fmt"

func main() {
	var a int = 100
	var b float32 = 100
	var c float64 = 100
	fmt.Println((a / 3) * 3)
	fmt.Println((b / 3) * 3)
	fmt.Println((c / 3) * 3)
}
// Output
33
33.333332
33.333333333333336

浮點數得實用性在於,若有一直重複乘除的動作,誤差可能會因此逐漸放大,所以除非想進一步節省記憶體用量,否則一般建立浮點數時,首選都是floart64。

package main

import "fmt"

func main() {
	var a int = 100
	var b float32 = 100
	var c float64 = 100
	fmt.Println((a / 3) * 3)
	fmt.Println((b / 3) * 3)
	fmt.Println((c / 3) * 3)
}
// Output
99
100
100

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

尚未有邦友留言

立即登入留言