📕
Go 語言程式設計入門
  • 最新消息
  • 中文版更新日誌
  • 譯者誌謝
  • 01-起步走
    • 01.01-檔案與資料夾
    • 01.02-終端機(Terminal)
    • 01.03-文字編輯器
    • 01.04-Go 的工具
  • 02-你的第一個程式
    • 02.01-如何讀 Go 程式
    • 02.02-問題
  • 03-型別
    • 03.01-數字
    • 03.02-字串
    • 03.03-問題
  • 04-變數
    • 04.01-如何命名變數
    • 04.02-Scope(變數的作用範圍)
    • 04.03-常數(Constant)
    • 04.04-定義多個變數
    • 04.05-範例程式
    • 04.06-問題
  • 05-控制結構
    • 05.01-For
    • 05.02-If
    • 05.03-switch
    • 05.04-問題
  • 06-Array、Slice 與 Map
    • 06.01-陣列(Array)
    • 06.02-Slice
    • 06.03-Map
    • 06.04-問題
  • 07-函式
    • 07.01-你的第二個函式
    • 07.02-回傳多個值
    • 07.03-參數個數可變的函式(Variadic Function)
    • 07.04-Closure
    • 07.05-遞迴(Recursive)
    • 07.06-Defer, Panic & Recover
    • 07.07-Panic & Recover
    • 07.08-問題
  • 08-指標
    • 08.01-「*」與「&」運算符號
    • 08.02-new
    • 08.03-問題
  • 09-Struct 與 Interface
    • 09.01-struct
    • 09.02-Method
    • 09.03-Interface
    • 09.04-問題
  • 10-Concurrency(平行處理)
    • 10.01-Goroutine
    • 10.02-Channel
    • 10.03-問題
  • 11-Packages
    • 11.01-建立 Package
    • 11.02-文件
    • 11.03-問題
  • 12-測試
  • 13-The Core Packages
    • 13.01-字串
    • 13.02-輸入與輸出
    • 13.03-檔案與資料夾
    • 13.04-錯誤訊息
    • 13.05-Container 與 Sort
    • 13.06-雜湊&加解密
    • 13.07-伺服器
    • 13.08-解析命令列參數
    • 13.09-Synchronization Primitives(同步處理原始物件)
  • 14-下一步
    • 14.01-閱讀大師作品
    • 14.02-動手實作
    • 14.03-團隊合作
  • 15. 附錄-額外資源
Powered by GitBook
On this page
Edit on GitHub

04-變數

到目前為止,我們只看過程式使用固定的值(數字、字串等),但是這樣的程式並不實用,所以如果要寫實用的程式,我們需要學習兩個新的概念:變數與控制流程。本章將詳細的介紹變數。

變數是一個儲存位置,有特定的型別及相關的名字,我們來改一下第二章寫的程式,讓它使用變數:

package main

import "fmt"

func main() {
    var x string = "Hello World"
    fmt.Println(x)
}

注意原本程式的字串值在這個程式裡依然會出現,但不是直接將字串送給 Println 函式,而是將字串指派給變數。Go 的變數是透過 var 關鍵字所建立的,接著指定變數名稱(x)為字串型別(string),最後將字串值 (Hello World)指定給變數,最後一個非必要的步驟,寫這個程式的另一種方式如下:

package main

import "fmt"

func main() {
    var x string
    x = "Hello World"
    fmt.Println(x)
}

在 Go 裡的變數類似代數的變數,但是有些微的差異:

首先,當我們看到 = 符號時,我們直覺會讀成 “x 等於 Hello World 字串”,用這個方法讀程式不會有什麼問題,但是更好的方式是讀成 “將 Hello World 字串代入 x” 或者 “將 Hello World 字串指定給 x”。這樣的區分是很重要的,因為變數值會隨著程式的執行而變動(如其名所示),請試試看執行下列的程式:

package main

import "fmt"

func main() {
    var x string
    x = "first"
    fmt.Println(x)
    x = "second"
    fmt.Println(x)
}

實際上你甚至可以這麼做:

var x string
x = "first "
fmt.Println(x)
x = x + "second"
fmt.Println(x)

如果你用代數定理來讀這個程式是不合理的,不過如果你將這個程式看成一連串的指令來讀,就可以說的通了。在我們看到 x = x + "second" 時,我們應該將它讀成 “將變數 x 的值與字串值 second 連接在一起”。= 右邊會先運算,再來才將結果指定給 = 左邊的變數。

x = x + y 的形式在程式語言是很常見的,不過 Go 有個特殊的指派符號:+=,我們可以將 x = x + "second" 寫成 x += "second",這樣做的事情是相同的(別的運算符號用法也是一樣)。

Go 與代數的差異在於等式判斷的符號不同:==(兩個等號),== 跟 + 運算符類似,而且會傳回布林值(boolean),例如:

    var x string = "hello"
    var y string = "world"
    fmt.Println(x == y)

這個程式應該會印出 false,因為 hello 不等於 world,另一方面:

    var x string = "hello"
    var y string = "hello"
    fmt.Println(x == y)

這樣會印出 true,因為兩個字串一樣。

由於建立新變數時順便賦予初始值,在 Go 是很常見的,所以 Go 也支援了較短的寫法:

    x := "Hello World"

請注意,在 = 之前有 :,而且沒有指定型別。不需要型別的理由是因為 Go 編譯器可以依據你指定給變數的數值來推論出型別。(因為你指定字串數值,所以 x 的型別就是 string)。編譯器也可以推論使用 var 的句子:

    var x = "Hello World"

也適用於其它的型別:

    x := 5
    fmt.Println(x)

如果可以,你通常該用簡寫的格式。

Previous03.03-問題Next04.01-如何命名變數

Last updated 2 years ago