變數只是給程式可以操作的儲存區域的名字。Go中的每個變數都有一個特定的型別,它決定了變數的記憶體大小和布局; 可以儲存在儲存器內的值的範圍; 以及可以應用於該變數的一組操作。
變數的名稱可以由字母,數位和下劃線字元組成。它必須以字母或下劃線開頭。大寫和小寫字母是不同的名稱,因為Go是區分大小寫的。基於前一章中解釋的基本型別,有以下基本變數型別:
型別 | 描述 |
---|---|
byte | 通常為單個八位位元組(一個位元組),這是一個位元組型別。 |
int | 機器最自然的整數大小。 |
float32 | 單精度浮點值。 |
Go程式設計語言還允許定義各種其他型別的變數,我們將在後續章節中介紹如列舉,指標,陣列,結構,聯合等。在本章中,只學習研究基本變數型別。
變數定義意味著告訴編譯器為變數建立儲存的位置和大小。變數定義需要指定資料型別,並包含該型別的一個或多個變數的列表,如下所示:
var variable_list optional_data_type;
這裡,optional_data_type
是有效的Go資料型別,包括:byte
,int
,float32
,complex64
,boolean
等或任何使用者定義的物件等,並且variable_list
可以包括一個或多個用逗號分隔的識別符號變數名稱。一些有效的宣告如下所示:
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
); 所有其他變數的初始值為其資料型別的零值。
靜態型別變數宣告為編譯器提供了保證,即一個給定型別和名稱的變數,以便編譯器繼續進行進一步編譯,而不需要有關變數的完整詳細資訊。變數宣告僅在編譯時有其意義,編譯器需要在連結程式時按實際的變數宣告執行。
嘗試下面的範例,其中變數已宣告為一個型別,並已在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
動態型別變數宣告要求編譯器根據傳遞給它的值來解釋變數的型別。但編譯器並不需要指定一個變數為靜態型別。
看看下面的範例,這裡的變數宣告沒有任何型別,並已在main
函式中定義和初始化。注意,在型別推斷的情況下,已經將變數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
不同型別的變數可以在一次宣告中使用型別推斷。
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中有兩種表示式:
左值(lvalue
):參照儲存器位置的表示式稱為「lvalue
」表示式。左值可能出現在作業的左側或右側。
右值(rvalue
):術語右值(rvalue
)是指儲存在記憶體中某個地址的資料值。右值是不能賦值給它的值的表示式,右值只可能出現在賦值的右側而不是左側。
變數是左值,因此可能出現在賦值的左側。數位文字是右值,因此不可能分配,也不能出現在左側。以下是有效的語句:
x = 20.0
但以下不是有效的語句,並會生成編譯時錯誤:
10 = 20