iT邦幫忙

2024 iThome 鐵人賽

DAY 5
1
Modern Web

Go 快 Go 高效: 從基礎語法到現代Web應用開發系列 第 5

【Day05】Golang 基礎語法 | 型別宣告與別名(Types & Alias)

  • 分享至 

  • xImage
  •  

Golang 中的基本型別

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(指向函數的指標)

說明:

  • 對於 intuint,它們的記憶體大小取決於系統的架構。如果是 32 位元系統,則是 4 bytes。如果是 64 位元系統,則是 8 bytes。
  • slicemapchan 這些引用型資料結構,它們的記憶體大小主要是存放內部指標。
  • interfacestring 包含指向底層數據的指標,因此需要更多的記憶體來存放這些指標。

Golang 中的變數宣告方式

保留的關鍵字(這些關鍵字在 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 關鍵字來宣告單一變數:
var x int
x = 10

在這裡,我們先宣告了一個名為 x 的變數,型別為 int,並在下一行賦值為 10。當然,這樣寫的話,變數 x 會被初始賦予其零值(在 int 的情況下為 0)。

  • 在宣告的同時進行賦值:
var y int = 20
  • 省略型別,因為 Golang 會自動根據賦值推斷型別:
var z = 30 // Golang 自動推斷 z 為 int 型別
  • Golang 還提供了一種簡便的變數宣告方法,使用 := 符號可以同時完成變數的宣告與賦值:
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 是靜態型別語言,這意味著每個變數的型別在編譯時就會被檢查。這種靜態型別系統能幫助開發者在程式編譯階段就捕捉到型別錯誤,從而減少運行時的錯誤發生。具體好處包括:

  • 可預測性:因為變數的型別在編譯時期已知,這有助於提升程式的可預測性。
  • 編譯時期錯誤檢測:如果型別使用不正確,編譯器會在編譯階段發現問題,減少執行期錯誤。

var vs const

在 Golang 中,var 用來宣告變數,而 const 用來宣告常數變數的值可以在程式的執行期間變更,但常數一旦宣告後其值不可改變

  • var 宣告變數:
var x int = 10
x = 20  // 變數 x 的值可以變更
  • const 宣告常數:
const pi float64 = 3.14159
pi = 3.14  // 這行會出錯,因為常數的值不可變

常數的特性:

  • 不可修改:常數的值在程式執行期間不可變動。
  • 更具可讀性:使用常數可以讓程式碼中的特殊值有更清楚的名稱,增加可讀性。

自訂型別(Custom Types)

除了內建的基本型別,Golang 也允許我們定義自己的型別。自訂型別可以幫助我們提高程式的可讀性,並且可以將不同的邏輯責任分開。
package main

import "fmt"

// 宣告一個新型別 Age,實際上是 int 型別
type Age int

func main() {
    var myAge Age = 25
    fmt.Println("My Age:", myAge)
}

在這個範例中,我們定義了一個新的型別 Age,它本質上是一個 int。這樣做的好處是,未來當我們看到 Age 這個型別時,我們就會知道它專門表示年齡,而不會與其他 int 混淆。


單一職責原則(Single Responsibility Principle, SRP)

在 Golang 中,應用 單一職責原則(Single Responsibility Principle, SRP) 可以幫助我們保持程式碼簡單且易於維護。SRP 的核心是每個型別只應承擔單一的角色。例如,當我們定義一個 Age 型別時,它應該只用來表示「年齡」,而不應該混入其他與年齡無關的資訊。

應用 SRP 的範例:

// 宣告一個新型別 Age,這個型別專門用來表示年齡
type Age int

// 錯誤的做法:不要將其他不相關的資料混入 Age 型別
type AgeWithLocation int // 不應用 Location 的概念

在這裡,我們讓 Age 型別只負責與年齡相關的內容。如果未來我們需要表示與地理位置相關的資料,我們應該創建一個新的型別,而不是擴展 Age 型別來承擔過多的責任。這樣可以讓程式在修改或擴展時保持簡單。


型別別名(Alias Types)

型別別名讓我們可以為現有的型別創建新的名稱,而不需要重新定義整個型別。別名型別本質上還是它原始的型別,只是有了另一個名稱。這通常用於增強程式的可讀性,或在不同的上下文中使用更合適的名稱。
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 型別的所有操作。


自訂型別 vs. 型別別名

  • 兩者看起來類似,但它們有不同的用途:
    • 自訂型別(Custom Type):是創建一個全新的型別,雖然它的底層結構可能與某個基本型別相同,但它會被視為不同的型別,無法與其底層型別直接交換使用。
    • 型別別名(Alias Type):則只是為現有型別取了個新名字,本質上還是相同的型別,所有的操作與原始型別相同。

總結

今天我們學習了 Golang 的基本型別及其預設值,變數的各種宣告方式,包括單一宣告、大量宣告,以及 var 與 const 的區別。我們還討論了型別安全性與其對程式的幫助,並介紹了如何使用自訂型別和型別別名來提升程式的可讀性與可維護性。同時,我們也應用了單一職責原則(SRP),強調每個型別應該只負責單一的角色,這樣可以保持程式結構的簡潔和易於維護。


上一篇
【Day04】快速上手 | GoLand 快捷鍵大全
下一篇
【Day06】Golang 基礎語法 | 條件判斷與分支控制 (If-else 與 Switch)
系列文
Go 快 Go 高效: 從基礎語法到現代Web應用開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言