前文回顧
前面的文章介紹了 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求索