本文 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. 比較運算子
比較運算子產生布林值(true 或 false),常用於條件判斷與迴圈控制。
| 運算子 | 說明 |
|---|---|
== |
等於 |
!= |
不等於 |
< |
小於 |
> |
大於 |
<= |
小於或等於 |
>= |
大於或等於 |
程式碼範例 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 會編譯錯誤。 |
只在 int、uint、uintptr 上使用 %。 |
| 比較不同型別 | int 與 float64 直接比較會編譯失敗。 |
先統一型別(轉型)再比較。 |
| 短路求值誤用 | 以為 && 會先執行右側,實際上左側先執行。 |
設計條件時,將「保護性」檢查放在左側。 |
| 位元運算的符號優先順序 | a & b == 0 可能被誤解為 (a & b) == 0,但實際上 & 優先度低於 ==。 |
使用括號明確運算順序:(a & b) == 0。 |
其他最佳實踐
- 使用複合賦值 (
+=,-=…) 可以讓程式更簡潔且降低錯誤機率。 - 盡量避免在條件式內做複雜計算,將計算結果先存入變數,提升可讀性。
- 對於布林運算,善用短路求值,例如
if err != nil && someCheck(),可避免在err為nil時呼叫someCheck()。 - 在需要精確小數計算時,考慮使用
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 的旅程中寫出更好、更安全的程式碼!