- Go 教程
- Go - 首頁
- Go - 概覽
- Go - 環境設定
- Go - 程式結構
- Go - 基本語法
- Go - 資料型別
- Go - 變數
- Go - 常量
- Go - 運算子
- Go - 決策語句
- Go - 迴圈語句
- Go - 函式
- Go - 作用域規則
- Go - 字串
- Go - 陣列
- Go - 指標
- Go - 結構體
- Go - 切片
- Go - 範圍
- Go - 對映
- Go - 遞迴
- Go - 型別轉換
- Go - 介面
- Go - 錯誤處理
- Go 有用資源
- Go - 問題與解答
- Go - 快速指南
- Go - 有用資源
- Go - 討論
Go - 變數
變數只不過是程式可以操作的儲存區域的名稱。Go 中的每個變數都有一個特定的型別,該型別決定了變數記憶體的大小和佈局、可以儲存在該記憶體中的值的範圍以及可以應用於該變數的操作集。
變數的名稱可以由字母、數字和下劃線字元組成。它必須以字母或下劃線開頭。大小寫字母是不同的,因為 Go 區分大小寫。根據上一章解釋的基本型別,將存在以下基本變數型別:
| 序號 | 型別及描述 |
|---|---|
| 1 |
byte 通常是一個八位位元組(一個位元組)。這是一種位元組型別。 |
| 2 |
int 機器上最自然的整數大小。 |
| 3 | float32 單精度浮點值。 |
Go 程式語言還允許定義各種其他型別的變數,例如列舉、指標、陣列、結構體和聯合體,我們將在後續章節中討論這些變數。在本章中,我們將只關注基本變數型別。
Go 中的變數定義
變數定義告訴編譯器在哪裡以及為變數建立多少儲存空間。變數定義指定一個數據型別,幷包含一個或多個該型別變數的列表,如下所示:
var variable_list optional_data_type;
這裡,可選資料型別是有效的 Go 資料型別,包括 byte、int、float32、complex64、boolean 或任何使用者定義的物件等,變數列表可以包含一個或多個用逗號分隔的識別符號名稱。一些有效的宣告如下所示:
var i, j, k int; var c, ch byte; var f, salary float32; d = 42;
語句“var i, j, k;”宣告並定義了變數 i、j 和 k;它指示編譯器建立名為 i、j 和 k 的 int 型別變數。
變數可以在其宣告中進行初始化(分配初始值)。變數的型別由編譯器根據傳遞給它的值自動判斷。初始化程式由一個等號後跟一個常量表達式組成,如下所示:
variable_name = value;
例如,
d = 3, f = 5; // declaration of d and f. Here d and f are int
對於沒有初始化程式的定義:具有靜態儲存持續時間的變數隱式初始化為 nil(所有位元組的值均為 0);所有其他變數的初始值為其資料型別的零值。
Go 中的靜態型別宣告
靜態型別變數宣告向編譯器保證存在一個具有給定型別和名稱的變數,以便編譯器可以在不需要變數的完整細節的情況下繼續進行進一步的編譯。變數宣告僅在編譯時才有意義,編譯器在程式連結時需要實際的變數宣告。
示例
嘗試以下示例,其中變數已使用型別宣告並在 main 函式內部初始化:
package main
import "fmt"
func main() {
var x float64
x = 20.0
fmt.Println(x)
fmt.Printf("x is of type %T\n", x)
}
當以上程式碼編譯並執行時,會產生以下結果:
20 x is of type float64
Go 中的動態型別宣告/型別推斷
動態型別變數宣告要求編譯器根據傳遞給它的值來解釋變數的型別。編譯器不需要變數作為必要條件靜態地具有型別。
示例
嘗試以下示例,其中變數未宣告任何型別。請注意,在型別推斷的情況下,我們使用 := 運算子初始化變數 y,而 x 使用 = 運算子初始化。
package main
import "fmt"
func main() {
var x float64 = 20.0
y := 42
fmt.Println(x)
fmt.Println(y)
fmt.Printf("x is of type %T\n", x)
fmt.Printf("y is of type %T\n", y)
}
當以上程式碼編譯並執行時,會產生以下結果:
20 42 x is of type float64 y is of type int
Go 中的混合變數宣告
可以使用型別推斷一次宣告不同型別的變數。
示例
package main
import "fmt"
func main() {
var a, b, c = 3, 4, "foo"
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Printf("a is of type %T\n", a)
fmt.Printf("b is of type %T\n", b)
fmt.Printf("c is of type %T\n", c)
}
當以上程式碼編譯並執行時,會產生以下結果:
3 4 foo a is of type int b is of type int c is of type string
Go 中的左值和右值
Go 中有兩種表示式:
左值 - 指向記憶體位置的表示式稱為“左值”表示式。左值可以出現在賦值的左側或右側。
右值 - 術語右值指的是儲存在記憶體中某個地址的資料值。右值是一個不能為其分配值的表示式,這意味著右值可以出現在賦值的右側,但不能出現在左側。
變數是左值,因此可以出現在賦值的左側。數字文字是右值,因此不能賦值,也不能出現在左側。
以下語句有效:
x = 20.0
以下語句無效。它將生成編譯時錯誤:
10 = 20