程式實體是 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")變數重宣告必須滿足:
- 至少有一個新變數
- 重宣告的變數型別必須與原宣告一致
- 必須在同一個程式碼區塊中
程式碼區塊與作用域#
Go 有六種程式碼區塊,由小到大:
- 語句區塊:if、for、switch 等語句的區塊
- 函式區塊:函式內部區域
- 套件區塊:當前套件的所有原始碼
- 檔案區塊:當前檔案的程式碼
- 匯入區塊:匯入的套件範圍
- 全域區塊:內建識別字(如 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) // 輸出: 區域
}