Golang 是一個靜態型別語言,這意味著每個變數的型別在編譯時期就必須決定,這樣可以增加程式的安全性與可預測性。Golang 內建了以下基本型別,那我們就來看看吧!
型別 | 說明 | 預設值 | 記憶體大小 |
---|---|---|---|
int | 有號整數 | 0 | 根據架構決定(32 位元或 64 位元) |
int8 | 有號整數 | 0 | 1 byte (8 bits) |
int16 | 有號整數 | 0 | 2 bytes (16 bits) |
int32 | 有號整數 | 0 | 4 bytes (32 bits) |
int64 | 有號整數 | 0 | 8 bytes (64 bits) |
uint | 無號整數 | 0 | 根據架構決定(32 位元或 64 位元) |
uint8 | 無號整數 | 0 | 1 byte (8 bits) |
uint16 | 無號整數 | 0 | 2 bytes (16 bits) |
uint32 | 無號整數 | 0 | 4 bytes (32 bits) |
uint64 | 無號整數 | 0 | 8 bytes (64 bits) |
float32 | 浮點數 | 0.0 | 4 bytes (32 bits) |
float64 | 浮點數 | 0.0 | 8 bytes (64 bits) |
complex64 | 複數 | (0 + 0i) | 8 bytes (64 bits) |
complex128 | 複數 | (0 + 0i) | 16 bytes (128 bits) |
bool | 布林值 | false | 1 byte |
string | 字串型別 | "" | 16 bytes(字串指標 + 長度) |
array | 陣列(固定長度) | 根據型別對應不同的預設值 | 取決於元素大小 * 陣列長度 |
slice | 切片(動態長度) | nil | 24 bytes (3 個指標:長度、容量、指向底層陣列) |
map | 鍵值對集合 | nil | 8 bytes(指向內部結構的指標) |
struct | 結構體 | 根據型別對應不同的預設值 | 取決於結構體中的欄位大小 |
pointer | 指標 | nil | 根據架構決定(32 位元或 64 位元) |
chan | 通道 | nil | 8 bytes(指向內部結構的指標) |
interface | 介面 | nil | 16 bytes(2 個指標:類型和數據) |
function | 函數 | nil | 8 bytes(指向函數的指標) |
int
和 uint
,它們的記憶體大小取決於系統的架構。如果是 32 位元系統,則是 4 bytes。如果是 64 位元系統,則是 8 bytes。slice
、map
和 chan
這些引用型資料結構,它們的記憶體大小主要是存放內部指標。interface
和 string
包含指向底層數據的指標,因此需要更多的記憶體來存放這些指標。保留的關鍵字(這些關鍵字在 Golang 中有特殊的用途,不能作為變數或函數名稱。)
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
var x int
x = 10
在這裡,我們先宣告了一個名為 x 的變數,型別為 int,並在下一行賦值為 10。當然,這樣寫的話,變數 x 會被初始賦予其零值(在 int 的情況下為 0)。
var y int = 20
var z = 30 // Golang 自動推斷 z 為 int 型別
a := 40 // a 自動被推斷為 int 型別
這種 := 符號只能用於函數內部的變數宣告,無法用在全域變數上!
當我們需要宣告多個變數時,可以將它們寫在一行或利用括號來進行大量宣告:
var x, y, z int = 1, 2, 3
var a, b, c = 10, 20, "Hello"
var (
m int
n string
o float64 = 3.14
)
這種方式在宣告多個不同型別的變數時特別方便,也讓程式碼更具可讀性。
Golang 是靜態型別語言,這意味著每個變數的型別在編譯時就會被檢查。這種靜態型別系統能幫助開發者在程式編譯階段就捕捉到型別錯誤,從而減少運行時的錯誤發生。具體好處包括:
在 Golang 中,var
用來宣告變數,而 const
用來宣告常數。變數的值可以在程式的執行期間變更
,但常數一旦宣告後其值不可改變
。
var x int = 10
x = 20 // 變數 x 的值可以變更
const pi float64 = 3.14159
pi = 3.14 // 這行會出錯,因為常數的值不可變
常數的特性:
- 不可修改:常數的值在程式執行期間不可變動。
- 更具可讀性:使用常數可以讓程式碼中的特殊值有更清楚的名稱,增加可讀性。
package main
import "fmt"
// 宣告一個新型別 Age,實際上是 int 型別
type Age int
func main() {
var myAge Age = 25
fmt.Println("My Age:", myAge)
}
在這個範例中,我們定義了一個新的型別 Age,它本質上是一個 int。這樣做的好處是,未來當我們看到 Age 這個型別時,我們就會知道它專門表示年齡,而不會與其他 int 混淆。
在 Golang 中,應用 單一職責原則(Single Responsibility Principle, SRP) 可以幫助我們保持程式碼簡單且易於維護。SRP 的核心是每個型別只應承擔單一的角色。例如,當我們定義一個 Age 型別時,它應該只用來表示「年齡」,而不應該混入其他與年齡無關的資訊。
應用 SRP 的範例:
// 宣告一個新型別 Age,這個型別專門用來表示年齡
type Age int
// 錯誤的做法:不要將其他不相關的資料混入 Age 型別
type AgeWithLocation int // 不應用 Location 的概念
在這裡,我們讓 Age 型別只負責與年齡相關的內容。如果未來我們需要表示與地理位置相關的資料,我們應該創建一個新的型別,而不是擴展 Age 型別來承擔過多的責任。這樣可以讓程式在修改或擴展時保持簡單。
package main
import "fmt"
// 將 int 型別取一個別名 Number
type Number = int
func main() {
var a Number = 100
fmt.Println("Value of a:", a)
}
在這個範例中,Number 是 int 的別名,因此變數 a 可以使用 int 型別的所有操作。
今天我們學習了 Golang 的基本型別及其預設值,變數的各種宣告方式,包括單一宣告、大量宣告,以及 var 與 const 的區別。我們還討論了型別安全性與其對程式的幫助,並介紹了如何使用自訂型別和型別別名來提升程式的可讀性與可維護性。同時,我們也應用了單一職責原則(SRP),強調每個型別應該只負責單一的角色,這樣可以保持程式結構的簡潔和易於維護。