Calvert's murmur

Golang 變數、零值和型別推斷

2019-11-05

約 2996 字 / 需 16 分鐘閱讀

原文:CalliCoderGolang Variables, Zero Values, and Type inference

變數和資料型別入門

每個程式都需要在記憶體中儲存一些資料。資料被儲存在特定的記憶體位置。

變數只是為儲存資料的記憶體位置所取的一個方便的名稱。除了名稱外,每個變數還有關聯的型別。

資料型別或簡易型別會對相關的資料集進行分類,定義它們的儲存方式、可以儲存的值的範圍以及可以對其執行的運算。

舉例來說,Golang 有個資料型別為 int8。它表示 8 位元整數值的範圍可以從 -128 到 127。它也定義了可以對 int8 資料型別執行的運算,如加、減、乘、除等。

我們在 Golang 中也有一個 int 資料型別,其大小取決於平台。在 32 位元系統上,它的大小為 32 位元,在 64 位元系統上,它的大小為 64 位元。

Golang 中的其他資料型別範例有 boolstringfloat32float64等。在下一個教學中,你將了解關於這些資料型別的更多資訊。我在這簡要介紹了資料型別,因為在深入研究 Golang 變數之前有必要了解它們。

深入 Golang 變數

宣告變數

在 Golang 中,我們使用 var 關鍵字來宣告變數:

var firstName string
var lastName string
var age int

如下所示,你也可以一次宣告多個變數:

var (
	firstName string
	lastName  string
	age       int
)

你甚至可以使用逗號組合多個相同型別的變數宣告:

var (
	firstName, lastName string
	age                 int
)

零值

任何沒有初始值的變數宣告都會有零值,具體取決於變數的型別:

型別 零值
bool false
string “”
int、int8、int16 等 0
float32、float64 0.0

下面的範例展示了零值的概念:

package main

import "fmt"

func main() {
	var (
		firstName, lastName string
		age                 int
		salary              float64
		isConfirmed         bool
	)

	fmt.Printf("firstName: %s, lastName: %s, age: %d, salary: %f, isConfirmed: %t\n",
		firstName, lastName, age, salary, isConfirmed)
}
# Output
firstName: , lastName: , age: 0, salary: 0.000000, isConfirmed: false

用初始值宣告變數

以下是如何在宣告時初始化變數的方法:

var firstName string = "Satoshi"
var lastName string = "Nakamoto"
var age int = 35

你也可以像這樣使用多個宣告:

var (
	firstName string = "Satoshi"
	lastName  string = "Nakamoto"
	age       int    = 35
)

甚至使用逗號組合多個相同型別的變數宣告,並像這樣初始化它們:

var (
	firstName, lastName string = "Satoshi", "Nakamoto"
	age int = 35
)

型別推斷

儘管 Go 是一種靜態型別的程式語言,但它不需要你明確指定宣告的每個變數的型別。

當你宣告具有初始值的變數時,Golang 會自動從右側的值推斷出變數的型別。因此,在宣告時初始化變數不需要指定型別:

package main

import "fmt"

func main() {
	var name = "Rajeev Singh" // Type declaration is optional here.
	fmt.Printf("Variable 'name' is of type %T\n", name)
}
# Output
Variable 'name' is of type string

在上面的範例中,Golang 自動從右側的值推斷出變數的型別為 string。如果你嘗試重新分派其他型別的值給變數,則編譯器將拋出錯誤:

var name = "Rajeev Singh" // Type inferred as `string`
name = 1234 // Compiler Error

如下所示,型別推斷讓我們可以在同一行中宣告和初始化不同資料型別的多個變數:

package main

import "fmt"

func main() {
	// Multiple variable declarations with inferred types
	var firstName, lastName, age, salary = "John", "Maxwell", 28, 50000.0

	fmt.Printf("firstName: %T, lastName: %T, age: %T, salary: %T\n",
		firstName, lastName, age, salary)
}
# Output
firstName: string, lastName: string, age: int, salary: float64

簡短宣告

Go 使用 := 運算子提供了簡短的變數宣告語法。這是宣告和初始化變數的簡寫(包含型別推斷)。

舉例來說,var name = "Rajeev" 的簡寫是 name := "Rajeev"。以下是完整範例:

package main

import "fmt"

func main() {
	// Short variable declaration syntax
	name := "Rajeev Singh"
	age, salary, isProgrammer := 35, 50000.0, true

	fmt.Println(name, age, salary, isProgrammer)
}
# Output
Rajeev Singh 35 50000 true

要注意的是,簡短的變數宣告只能在函數內使用。在函數外,每個陳述式都需要以 varfunc 等關鍵字開頭,因此,不可使用 := 運算子。

結論

變數是任何程式語言中的基本概念之一。在本文中,你學到了如何在 Golang 宣告變數、型別推斷如何運作,以及如何使用複合式宣告和簡短宣告。

Tags: Golang