天天看點

從零學 Go:基本文法介紹之變量的聲明與初始化

前文回顧

前面的文章介紹了 Go 相關的特性與入門案例,對于一門程式設計語言,變量和文法是我們首先需要掌握的。Golang 在文法上與 C 語言有很多相似支援,但是比 C 語言更加簡約。如果你有一定的 C 語言基礎,閱讀起來就事半功倍,即時沒有也沒關系,因為 Golang 的文法非常易于了解。

本系列文章将會介紹 Go 語言基礎文法的相關知識,本文将首先從變量的聲明與初始化講起。

變量的聲明與初始化

在 HelloGo 中,我們已經聲明了不少的變量,樣式如下所示:

var input string      

上述代碼中聲明了一個

string

類型,變量名為

input

的變量。Golang 在聲明變量時,會自動把變量對應的記憶體區域進行初始化操作,每個變量會被初始化為其類型的預設值。變量聲明樣式如下所示:

var name T      

一些常見的變量的聲明樣式如下:

var a int //聲明一個 int 類型的變量
var b string //聲明一個 string 類型的變量
var c []float //聲明一個 float 類型的切片
var d struct{ // 聲明一個匿名結構體,該結構體有一個 int 類型的字段
 x int
}
var e func() bool //聲明一個函數變量
var (
 f int
 g string
)
// 同時聲明多組變量      
在 Golang 中,每一個聲明的變量都必須被使用,否則會編譯不通過。

對變量進行聲明之後,我們還需要對變量空白的記憶體區域進行初始化,也就是指派。與其他的語言一緻,通過

=

指派符号初始化,如下例子:

var a int = 100      

上述代碼中,聲明了一個

int

類型的

a

變量,并将其指派為

100

。變量初始化的樣式為:

var name T = 表達式      

當然可以利用 Golang 提供的類型推導文法糖特性,精簡為以下的樣式:

var a = 100
b := "Hello"      

在省略了類型屬性後,編譯器會嘗試根據等号右邊的表達式推導出變量的類型。注意在使用

:=

短變量聲明初始化時,左值中的變量最少有一個變量必須是未定義過的變量,否則會出現編譯錯誤。同時

:=

不能出現在全局變量的聲明和初始化中。

var a = 100
a := 100 //編譯報錯
a, b := 100, "OK" //無異常      

在上述代碼中,

a := 100

會在編譯過程中抛出

no new variables on left side of :=

的報錯;而

a, b := 100

不會。

我們可以嘗試運作 Variable 中的代碼,看一下編譯器的類型推導結果。

// Variable.go
package main
import "fmt"
func main()  {
 var a int = 100
 var b = "100"
 c := 0.17
 fmt.Printf("a value is %v, type is %T\n", a, a)
 fmt.Printf("b value is %v, type is %T\n", b, b)
 fmt.Printf("c value is %v, type is %T\n", c, c)
}      

輸出結果如下:

a value is 100, type is int
b value is 100, type is string
c value is 0.17, type is float64      

從上述表示結果可以看到,變量都被賦予了正确的變量類型。需要注意的是,為了提供精度,浮點數類型會被預設推導為

float64

與 C 語言相比,除了類型推導的文法糖特性,Golang 還提供了多重指派和匿名變量的文法糖特性。

在過去的程式設計語言中,如果我們想要交換變量的值,就需要借助一個第三方臨時變量來實作,如下例子所示:

var a int = 1
var b int = 2
var tmp int
tmp = a
a = b
b = tmp      

在 Golang 中,我們可以通過多重指派的特性輕松實作類似的變量交換任務,如下所示:

var a int = 1
var b int = 2
b, a = a, b      

在多重指派的過程中,變量的左值和右值按照從左往右的順序指派。

在 Golang 中,被聲明的變量必須被使用,否則會被編譯器抛出異常。Golang 支援函數多傳回值和上面所說的多重指派,但是有些時候我們不需要使用某些左值,可以使用匿名變量處理,具體例子如 Anonymous.go 所示:

package main
import "fmt"
// 傳回一個人的姓和名
func getName() (string, string){
 return "王", "小二"
}
func main()  {
 surname, _ := getName()
 _, personalName := getName()
 fmt.Printf("My surname is %v and my personal name is %v", surname, personalName)
}      

通過在不需要的變量聲明的地方使用

_

代替變量名,我們就可以忽略部分不需要的左值。匿名變量不占用命名空間,不會配置設定記憶體。匿名變量與匿名變量之間也不會因為多次聲明而無法使用。

小結

變量一般是指程式運作過程中存儲資料的抽象概念,它的值是允許改變的;與之相對的是常量,它的值在程式運作過程中是不允許變化的。下面的文章,我們将會介紹 Go 語言的原生資料類型。

閱讀最新文章,關注公衆号:aoho求索

繼續閱讀