Go語言變數

變數只是給程式可以操作的存儲區域的名字。Go中的每個變數都有一個特定的類型,它決定了變數的記憶體大小和佈局; 可以存儲在記憶體內的值的範圍; 以及可以應用於該變數的一組操作。

變數的名稱可以由字母,數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫和小寫字母是不同的名稱,因為Go是區分大小寫的。基於前一章中解釋的基本類型,有以下基本變數類型:

類型 描述
byte 通常為單個八位位元組(一個位元組),這是一個位元組類型。
int 機器最自然的整數大小。
float32 單精確度浮點值。

Go編程語言還允許定義各種其他類型的變數,我們將在後續章節仲介紹如枚舉,指針,數組,結構,聯合等。在本章中,只學習研究基本變數類型。

Go變數定義

變數定義意味著告訴編譯器為變數創建存儲的位置和大小。變數定義需要指定數據類型,並包含該類型的一個或多個變數的列表,如下所示:

var variable_list optional_data_type;

這裏,optional_data_type是有效的Go數據類型,包括:byteintfloat32complex64boolean等或任何用戶定義的對象等,並且variable_list可以包括一個或多個用逗號分隔的識別字變數名稱。一些有效的聲明如下所示:

var    i, j, k int;
var   c, ch byte;
var  f, salary float32;
d = 42;

var i,j,k;這一行,聲明和定義變數ijk; 它指示編譯器創建名稱為ijk的類型為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中有兩種運算式:

  1. 左值(lvalue):引用記憶體位置的運算式稱為“lvalue”運算式。左值可能出現在作業的左側或右側。

  2. 右值(rvalue):術語右值(rvalue)是指存儲在內存中某個地址的數據值。右值是不能賦值給它的值的運算式,右值只可能出現在賦值的右側而不是左側。

變數是左值,因此可能出現在賦值的左側。數字文字是右值,因此不可能分配,也不能出現在左側。以下是有效的語句:

x = 20.0

但以下不是有效的語句,並會生成編譯時錯誤:

10 = 20

上一篇: Go語言數據類型 下一篇: Go語言常量