Published on

[Go 學習系列] 3. Golang 語法入門:變數、常數與型別

Authors
  • avatar
    Name
    Vic Chen
    Twitter

為什麼要先理解語法基礎?

在上篇我們已經成功執行了第一個 Hello Go! 程式。
但要能寫出更完整的邏輯,我們得先了解 Go 的變數宣告與型別系統

Go 是一個「強型別(Strongly Typed)」的語言,它強制你在編譯時期就確定變數的型別,
這讓程式更安全,也更容易維護。


變數宣告方式

Go 支援幾種不同的變數宣告方法。這裡我們逐一介紹。

1️⃣ 使用 var 宣告

最基本的變數宣告方式:

var name string = "Vic"
var age int = 30

你也可以同時宣告多個變數:

var a, b int = 1, 2

NOTE

var 關鍵字可搭配明確型別,也可讓編譯器自動推論(type inference):

var message = "Hello Go!"  // Go 自動推論為 string

2️⃣ 短變數宣告(:=)

在函式內常用的寫法:

name := "Alice"
age := 25

這等價於 var name string = "Alice"
但要注意::= 不能用在函式外部(也就是不能在 package level 使用)。

下面是一個錯誤範例 👇:

package main

// ❌ Compile Error: non-declaration statement outside function
greeting := "Hi" // 短變數宣告只能用在函式內部

func main() {
    println(greeting)
}

正確的寫法應該是使用 var

package main

var greeting = "Hi"

func main() {
    println(greeting)
}

3️⃣ 多重賦值與忽略變數

Go 支援多重回傳與多重賦值:

x, y := 1, 2
x, y = y, x

也可以透過「空白識別字 _」忽略不需要的回傳值:

result, _ := divide(10, 2) // 忽略第二個回傳值

常數(Constant)

使用 const 宣告固定不變的值:

const Pi = 3.14159
const Greeting = "Hello"

NOTE

常數一旦定義後無法修改,也不能透過運算式在執行時期決定。


使用 iota 自動產生枚舉值

Go 提供 iota 幫你產生連續數值(常用於列舉):

const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
)

輸出結果:

Sunday: 0
Monday: 1
Tuesday: 2
Wednesday: 3

基本資料型別

Go 的基本型別主要分為:

類別型別名稱範例
整數int、int8、int16、int32、int64var n int = 10
浮點數float32、float64var f float64 = 3.14
布林boolvar active bool = true
字串stringvar s string = "Hello"
字元rune(代表 Unicode)var r rune = '字'
位元byte(uint8 的別名)var b byte = 'A'

TIP

Go 的 string 是以 UTF-8 編碼 儲存的,中文和 emoji 都可以正確顯示。


rune vs byte 差異

ch := '好'    // rune,實際型別是 int32
b := 'A'     // byte,實際型別是 uint8

fmt.Printf("%c = %d\n", ch, ch)
fmt.Printf("%c = %d\n", b, b)

輸出:

= 22909
A = 65

Go 的命名與可見性規則

Go 的封裝機制很簡單:
大寫開頭的名稱 → 對外可見(public)
小寫開頭的名稱 → 僅在 package 內可見(private)

// 可被其他 package 引用
func PrintHello() { ... }

// 僅能在同一個 package 使用
func printInternal() { ... }

NOTE

Go 沒有像 Java 的 publicprivate 關鍵字,
只靠「首字母大小寫」來決定可見性,簡單又直覺。


🧩 小練習:BMI 計算器

我們來做個簡單練習,綜合應用變數、常數與基本型別。

package main

import "fmt"

func main() {
    const meterToCm = 100.0

    var name string
    var heightCm, weightKg float64

    fmt.Print("輸入姓名: ")
    fmt.Scanln(&name)

    fmt.Print("輸入身高(cm): ")
    fmt.Scanln(&heightCm)

    fmt.Print("輸入體重(kg): ")
    fmt.Scanln(&weightKg)

    heightM := heightCm / meterToCm
    bmi := weightKg / (heightM * heightM)

    fmt.Printf("%s 的 BMI 為 %.2f\n", name, bmi)
}

執行結果範例:

輸入姓名: Vic
輸入身高(cm): 180
輸入體重(kg): 75
Vic 的 BMI 為 23.15

結語

這篇我們學會了:

  • 如何宣告變數與常數
  • 了解 Go 的強型別特性
  • 基本資料型別與可見性規則

下一篇,我們將進一步探索 Go 的 控制流程與函數基礎
讓你的 Go 程式可以開始「有邏輯地思考」!