本文 AI 產出,尚未審核

Golang 基本語法與資料型態 — 運算子(算術、比較、邏輯)

簡介

在任何程式語言中,運算子都是最基礎也是最常使用的工具。它們負責在變數、常數或表達式之間執行計算、比較或布林判斷。對於剛踏入 Go 世界的學習者而言,熟悉算術、比較與邏輯運算子的行為與特性,直接影響程式的正確性與效能。

本篇文章以 繁體中文(台灣) 為語言,針對 Go 語言的三大類運算子進行深入說明,並提供實務範例、常見陷阱與最佳實踐,協助讀者從「會寫」升級到「寫得好」。


核心概念

1. 算術運算子

算術運算子用於數值型別(int, float64, uint 等)的基本計算。

運算子 說明 範例
+ 加法 a + b
- 減法 a - b
* 乘法 a * b
/ 除法(整數除會捨去餘數) a / b
% 餘數(只能用於整數) a % b
+= 加後賦值 a += 3
-= 減後賦值 a -= 2
*= 乘後賦值 a *= 5
/= 除後賦值 a /= 4
%= 餘數賦值 a %= 2

程式碼範例 1:基本算術運算

package main

import "fmt"

func main() {
    var a int = 10
    var b float64 = 3.5

    // 加法與型別轉換
    sum := float64(a) + b
    fmt.Printf("sum = %.2f\n", sum) // sum = 13.50

    // 整數除法與餘數
    quotient := a / 3      // 3,餘數被捨去
    remainder := a % 3     // 1
    fmt.Printf("quotient = %d, remainder = %d\n", quotient, remainder)
}

2. 比較運算子

比較運算子產生布林值(truefalse),常用於條件判斷與迴圈控制。

運算子 說明
== 等於
!= 不等於
< 小於
> 大於
<= 小於或等於
>= 大於或等於

程式碼範例 2:比較與條件分支

package main

import "fmt"

func main() {
    age := 20

    if age >= 18 {
        fmt.Println("已滿 18 歲,允許進入")
    } else {
        fmt.Println("未滿 18 歲,禁止進入")
    }

    // 多條件比較
    score := 85
    passed := score >= 60 && score <= 100 // && 為邏輯 AND
    fmt.Printf("成績 %d 是否合格?%v\n", score, passed)
}

3. 邏輯運算子

邏輯運算子用於布林值之間的運算,支援 短路求值(short‑circuit),即左側表達式若已決定結果,右側不會再被求值,這在避免不必要的計算或避免錯誤(例如除以零)時非常有用。

運算子 說明
&& 邏輯 AND(且)
`
! 邏輯 NOT(非)

程式碼範例 3:短路求值避免除以零

package main

import "fmt"

func safeDiv(a, b int) (int, bool) {
    if b == 0 {
        return 0, false // 直接返回,避免除以零
    }
    return a / b, true
}

func main() {
    // 使用 && 進行短路檢查
    if result, ok := safeDiv(10, 0); ok && result > 0 {
        fmt.Println("除法結果大於 0")
    } else {
        fmt.Println("除法失敗或結果不大於 0")
    }
}

4. 位元運算子(補充)

雖然本章主題聚焦在算術、比較與邏輯,位元運算子在底層開發或效能敏感的程式碼中亦相當重要。常見的位元運算子包括 &(AND)、|(OR)、^(XOR)、<<(左移)與 >>(右移)。

程式碼範例 4:使用位元檢查奇偶

package main

import "fmt"

func isEven(n int) bool {
    return n&1 == 0 // 只要最低位是 0,即為偶數
}

func main() {
    fmt.Println(isEven(42)) // true
    fmt.Println(isEven(15)) // false
}

常見陷阱與最佳實踐

陷阱 說明 建議的最佳實踐
整數除法自動捨去小數 5 / 2 會得到 2 而非 2.5 需要小數時,先將其中一個運算元轉型為 float64
除以零會 panic a / 0 會導致執行時錯誤。 在除法前先檢查除數,或使用 recover 捕捉 panic。
% 只能用於整數 嘗試 5.5 % 2 會編譯錯誤。 只在 intuintuintptr 上使用 %
比較不同型別 intfloat64 直接比較會編譯失敗。 先統一型別(轉型)再比較。
短路求值誤用 以為 && 會先執行右側,實際上左側先執行。 設計條件時,將「保護性」檢查放在左側。
位元運算的符號優先順序 a & b == 0 可能被誤解為 (a & b) == 0,但實際上 & 優先度低於 == 使用括號明確運算順序:(a & b) == 0

其他最佳實踐

  1. 使用複合賦值 (+=, -=…) 可以讓程式更簡潔且降低錯誤機率。
  2. 盡量避免在條件式內做複雜計算,將計算結果先存入變數,提升可讀性。
  3. 對於布林運算,善用短路求值,例如 if err != nil && someCheck(),可避免在 errnil 時呼叫 someCheck()
  4. 在需要精確小數計算時,考慮使用 math/big 套件的 big.Rat,而非浮點數直接比較。

實際應用場景

場景 可能使用的運算子 範例說明
金額計算 +, -, *, /, % 計算折扣後的金額、分期付款的每期金額、檢查是否為整數分期。
使用者權限檢查 &, ` , ^, ==`
資料驗證 &&, `
搜尋與過濾 >, <, >=, <=, ==, != 在資料庫或切片中篩選符合條件的紀錄。
效能優化 <<, >> 使用左移快速乘以 2 的次方,或右移除以 2 的次方。

範例:使用位元旗標管理使用者權限

package main

import "fmt"

const (
    PermRead  = 1 << iota // 1
    PermWrite              // 2
    PermDelete             // 4
)

func hasPermission(userPerm int, required int) bool {
    return userPerm&required == required
}

func main() {
    user := PermRead | PermWrite // 具備讀寫權限
    fmt.Println("Can Delete?", hasPermission(user, PermDelete)) // false
    fmt.Println("Can Write?", hasPermission(user, PermWrite))   // true
}

總結

  • 算術運算子是數值計算的基礎,注意整數除法的捨去行為與型別轉換。
  • 比較運算子產生布林結果,是條件分支與迴圈的核心。
  • 邏輯運算子提供布林組合,善用短路求值可提升效能與安全性。
  • 位元運算子在權限管理、效能優化等場景非常有用,使用時要留意運算子優先順序。

掌握這些運算子的特性與使用時機,能讓你在撰寫 Go 程式時更 簡潔、正確且具可讀性。未來進一步學習控制流程(if, switch, for)與函式式編程(map, filter)時,這些基礎運算子將持續發揮關鍵作用。祝你在 Go 的旅程中寫出更好、更安全的程式碼!