程式實體是 Go 中可以被命名的元素:變數、常數、函式、型別。

變數宣告#

Go 提供多種變數宣告方式:

// 標準宣告
var name string = "Go"

// 型別推斷
var version = "1.21"

// 短變數宣告(僅限函式內)
count := 10

// 多變數宣告
var (
    width  = 100
    height = 200
)

短變數宣告 := 只能在函式內部用,但更簡潔。在套件層級宣告變數時,必須用 var

型別推斷規則#

// 整數字面量預設推斷為 int
x := 42          // int

// 浮點數字面量預設推斷為 float64
y := 3.14        // float64

// 字串字面量推斷為 string
s := "hello"     // string

// 從已有變數推斷
var a int32 = 100
b := a           // int32(繼承 a 的型別)

型別轉換與型別斷言#

Go 是強型別語言,不同型別之間需要顯式轉換:

// 型別轉換(用於基本型別)
var i int = 42
var f float64 = float64(i)

// 型別斷言(用於介面型別)
var val interface{} = "hello"

// 安全的型別斷言
if str, ok := val.(string); ok {
    fmt.Println("字串值:", str)
} else {
    fmt.Println("不是字串型別")
}

// 型別 switch
switch v := val.(type) {
case string:
    fmt.Println("字串:", v)
case int:
    fmt.Println("整數:", v)
default:
    fmt.Println("未知型別")
}

變數重宣告規則#

在短變數宣告中,允許部分變數重宣告:

var err error

// 合法:n 是新變數,err 是重宣告
n, err := fmt.Println("hello")

// 合法:同一區塊中 err 被重新賦值
m, err := fmt.Println("world")

變數重宣告必須滿足:

  1. 至少有一個新變數
  2. 重宣告的變數型別必須與原宣告一致
  3. 必須在同一個程式碼區塊中

程式碼區塊與作用域#

Go 有六種程式碼區塊,由小到大:

  1. 語句區塊:if、for、switch 等語句的區塊
  2. 函式區塊:函式內部區域
  3. 套件區塊:當前套件的所有原始碼
  4. 檔案區塊:當前檔案的程式碼
  5. 匯入區塊:匯入的套件範圍
  6. 全域區塊:內建識別字(如 int、string、true 等)
package main

var global = "套件層級變數"

func main() {
    local := "函式層級變數"

    if true {
        inner := "區塊層級變數"
        fmt.Println(inner)  // 可存取
    }
    // fmt.Println(inner)  // 錯誤:inner 在此不可見

    fmt.Println(local, global)
}
變數遮蔽範例

內層區塊的變數會遮蔽外層同名變數:

package main

import "fmt"

var x = "全域"

func main() {
    fmt.Println(x)  // 輸出: 全域

    x := "區域"
    fmt.Println(x)  // 輸出: 區域

    if true {
        x := "內層"
        fmt.Println(x)  // 輸出: 內層
    }

    fmt.Println(x)  // 輸出: 區域
}