Go語言變量
變量只是給程序可以操作的存儲區域的名字。Go中的每個變量都有一個特定的類型,它決定了變量的內存大小和佈局; 可以存儲在存儲器內的值的範圍; 以及可以應用於該變量的一組操作。
變量的名稱可以由字母,數字和下劃線字符組成。它必須以字母或下劃線開頭。大寫和小寫字母是不同的名稱,因爲Go是區分大小寫的。基於前一章中解釋的基本類型,有以下基本變量類型:
類型
描述
byte
通常爲單個八位字節(一個字節),這是一個字節類型。
int
機器最自然的整數大小。
float32
單精度浮點值。
Go編程語言還允許定義各種其他類型的變量,我們將在後續章節中介紹如枚舉,指針,數組,結構,聯合等。在本章中,只學習研究基本變量類型。
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中的左值和右值:
Go中有兩種表達式:
左值(
lvalue
):引用存儲器位置的表達式稱爲「lvalue
」表達式。左值可能出現在作業的左側或右側。右值(
rvalue
):術語右值(rvalue
)是指存儲在內存中某個地址的數據值。右值是不能賦值給它的值的表達式,右值只可能出現在賦值的右側而不是左側。
變量是左值,因此可能出現在賦值的左側。數字文字是右值,因此不可能分配,也不能出現在左側。以下是有效的語句:
x = 20.0
但以下不是有效的語句,並會生成編譯時錯誤:
10 = 20