Go 程式設計教學:運算子

在上一篇文章中,我們介紹了 Go 的變數和資料型別。接著,在本篇文章中,我們會介紹運算子 (operator),不同的資料型別可用的運算子各自不同,透過運算子,我們可以操作資料,以達到不同的效果。

Go 包含以下運算子:

  • 代數運算子 (arithmetic operator):加 (+)、減 (-)、乘 (*)、除 (/)、取餘數 (%)
  • 二元運算子 (bitwise operator):AND (&)、OR (|)、XOR (^)、AND NOT (&^)、左移 (<<)、右移 (>>)
  • 比較運算子 (comparison operator):相等 (==)、不等 (!=)、小於 (<)、小於或等於 (<=)、大於 (>)、大於或等於 (>=)
  • 邏輯運算子 (logical operator):AND (&&)、OR (||)、NOT (!)
  • 位址運算子 (adress operator):*&
  • 接收運算子 (receive operator);<-

我們將在本文中逐一介紹這些操作子。

代數運算子

十進位數字的可用的運算子,就是基本的代數運算,相信大家都已經相當熟悉。實例如下:

浮點數沒有取餘數運算,其他運算和整數相同。另外,在 Go 裡面,除以零會引發程式錯誤,程式設計者需自行檢查及預防。

二元運算子

二元運算使用二進位數進行運算,有以下三種運算方式:

  • &:兩者皆為 1 時才為 1
  • |:兩者其中之一為 1 時即為 1
  • ^:兩者僅其一為 1 時才為 1

以下例子用二進元運算模擬系統權限:

許多旗標 (flag) 使用二進元運算,程式碼會比較簡潔。

比較運算子

比較運算子是用來比較兩個值之間的大小,基本上,Go 內建型態都可以相互比較。比較運算子會回傳布林值,主要是用在條件判斷中,我們將於後文介紹條件判斷。

邏輯運算子

邏輯運算子用來結合數個條件判斷,以達成複合的效果。一般程式設計書籍會提供真值表 (true value table),但其實不需要記憶那個表格,只要記得:

AND (&&):兩者皆為真才為真 OR (||):其中之一為真即為真 NOT (!):真變偽,偽變真

以下為實例:

邏輯運算子會回傳布林值,同樣也是用於條件判斷中。

位址運算子

位址運算子牽涉到指標 (pointer),接收運算子牽涉到通道 (channel),這都是比較進階的概念,我們將於後文介紹。

運算子優先順序

不同運算子放在一起時,有一套內定的順序 (precedence),如下:

Precedence    Operator
5             *  /  %  <<  >>  &  &^
4             +  -  |  ^
3             ==  !=  <  <=  >  >=
2             &&
1             ||

但是,不要記這個順序,因為:

  • 和數學上的運算先後順序相同
  • 可以用括號改變優先順序,同時可讓程式碼更清晰

經過本文的說明,相信讀者對運算子已經有相當的概念,日後可用在自己的程式中。在下一篇文章中,我們會介紹控制結構 (control structures),包括條件敘述 (condition) 和迴圈 (loop)。