美思 [Golang] 程式設計教學:使用變數 (Variable)

Golang變數
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

變數 (variable) 是電腦程式中用來操作資料 (data) 的一種語法特性。本文介紹如何在 Go 語言中使用變數。

實字 (Literal)

在介紹變數前,我們先介紹實字 (literal)。實字是在電腦程式中直接寫死的資料,在初階的電腦程式中常見。教學用的程式用實字是為了方便,實務上,我們會從電腦程式外部讀入資料,真正用到實字的時候反而少。

像是以下的 Hello World 程式就用到實字:

package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}

在這個程式中,"Hello World" 的部分就是字串形態的實字。

宣告和使用變數 (Variable)

在以下範例中,我們建立和使用變數 msg

package main

import "fmt"

func main() {
    // Declare the variable `msg`.
    var msg string
    // Assign some value to `msg`.
    msg = "Hello World"

    // Use `msg` as a function parameter.
    fmt.Println(msg)
}

在第一行程式中,我們使用 var 保留字宣告變數 msg,該變數的型別為 string (字串)。

在第二行程式中,我們將 "Hello World" 字串指派到 msg

最後,我們把 msg 做為函式的參數,傳入 fmt 套件的 Println 函式中。Println 會把傳入的字串印在終端機上。

雖然這個例子很短,我們可以從這個例子中看出變數有三個要件:

  • 識別字 (identifier)
  • 該變數的資料型別 (data type)
  • 該變數的值 (value)

透過宣告變數,我們賦予電腦程式新的識別字。原本 Go 語法中沒有此識別字,是程式設計師透過宣告變數新增的。

在電腦程式中,變數具有資料型別 (data type)。資料型別是資料的元資訊 (metadata),用來規範資料合法的操作。我們於先前的文章介紹過資料型別。讀者可回到先前的文章複習一下。

變數所指向的資料稱為值,所以值就是資料。

由於宣告變數是一個常見的動作,Go 語言提供另一種宣告變數的形式:

package main

import "fmt"

func main() {
    // Declare the variable `msg` and assign it some value.
    msg := "Hello World"

    // Use `msg` as a function parameter.
    fmt.Println(msg)
}

請注意在這種形式中,我們使用 := 來指派值,和先前的形式相異。在這種形式中,我們不需要加上型別的標註。因為 Go 語言會自動從值中推斷變數的型別。

宣告和使用常數 (Constant)

在以下例子中,我們宣告常數 PI

package main

import "fmt"

func main() {
    // Declare the constant `PI`
    const PI float64 = 3.1415927

    // The radius of a circle.
    r := 10.0

    // Get the area of the circle.
    fmt.Println(PI * r * r)
}

在這個範例中,我們使用 PI 計算一個圓的面積。其實 Go 語言內建一個更精準的圖周率,這個例子只是展示常數的使用方式。

宣告常數和宣告變數的概念雷同,只是把 var 換成 const 即可。但常數要直接用實字填值,不能由外部取得值。

宣告常數的好處在於常數宣告後即不能修改。若我們試圖修改常數,會在程式編譯時引發錯誤,提醒我們必需改掉錯誤的動作。

識別字 (Identifier) 的規範

不論是宣告變數或宣告常數,這些動作都是在 Go 程式中新增識別字。識別字要符合以下規範

  • 首字是字母 (letters) 或底線 (underscore)
  • 餘字可為字母、數字、底線
  • 不可使用保留字 (keywords) 或內建識別字 (predeclared identifiers)

使用單一底線做為識別字時,代表捨棄接收到的值。這項特性通常會搭配函式呼叫使用。參考以下例子:

package main

import (
    "fmt"
    "log"
)

func main() {
    _, err := fmt.Println("Hello World")

    if err != nil {
        log.Fatal(err)
    }
}

這個例子有點超出目前介紹的內容,但這個例子很短,仍然可以試著閱讀一下。

我們先前講過,fmt 套件的 Println 會回傳兩個值。在一般情形下,我們不會用到這兩個回傳值。在此處,我們捨棄第一個回傳值,但檢查第二個回傳值 err 是否為空。當 err 不為空時,即強制結束程式並印出錯誤訊息。

保留字 (Keywords)

保留字在程式碼中有特定的含義,故不能做為識別字。像是先前看到的 packageimportfuncvarconst 等都是保留字。Go 語言目前有 25 個保留字

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

在主流程式語言中,Go 語言的保留字算少。ANSI C 的保留字有 32 個;Python 3 的保留字有 45 個;C++ 的保留字則超過 100 個。保留字的數量越多,往往表示該語言的概念越複雜。

學程式設計時,請不要背誦保留字。在寫程式的過程中,自然而然會把保留字記起來。編輯器也會用顏色來提示保留字出現的地方。

內建識別字 (Predeclared Identifier)

Golang 官網的頁面有一份內建識別字的清單:

Types:
    bool byte complex64 complex128 error float32 float64
    int int8 int16 int32 int64 rune string
    uint uint8 uint16 uint32 uint64 uintptr

Constants:
    true false iota

Zero value:
    nil

Functions:
    append cap close complex copy delete imag len
    make new panic print println real recover

這些識別字已定義了,故不能當成識別字。

識別字的撰碼風格

在設置識別字時,通常會採用下列三種風格之一:

  • PascalCase
  • camelCase
  • snake_case

在 Go 語言中,使用 PascalCasecamelCase 有實質的意義,而非僅是風格的差異。當識別字使用 PascalCase 時,表示該識別字是公開的 (public)。反之,當使用 camelCase 時,表示該識別字是私有的 (private)。

因此,建議大部分的識別字都用 camelCase,而要公開的識別字用 PascalCase 來命名。至於 snake_case 通常不使用。

結語

在本文中,我們介紹了變數的組成要素及使用變數的方式。透過變數,就可以在電腦程式中操作資料。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。