Golang 第8節 變數
什麼是變數?
我們應該怎麼去理解變數? 在這裡我要舉一個例子:
大家應該都知道王者榮耀這個遊戲. 當我們在玩王者榮耀的時候, 我們操控的英雄的血量是不斷變化的, 這個血量是存在記憶體中的. 那麼這個血量就是一個變數.
在程式執行的過程中, 其值可以改變的量, 我們就稱為變數.
通過上面例子可以發現:
- 變數是儲存在記憶體中的
- 變數的值是可以改變的
我們說變數是儲存在記憶體中, 那麼記憶體又是什麼呢?
記憶體是一個連續的資料集合, 每一個記憶體儲存區域都有一個唯一的地址標識, 稱為記憶體地址. 就好比我們的身份證一樣, 每個人都有一個唯一的身份證.
我們知道了變數是什麼, 那麼在 Go 語言中, 變數應該如何定義呢?
變數的定義
我們現在理解了變數可以用來儲存資料,但是我們要儲存的資料型別是各種各樣的。例如:整數、小數、文字等等。
所以我們必須在定義變數時就要告訴計算機我們要定義的變數儲存的是什麼型別的資料。那麼在記憶體中就可以根據不同的型別來開闢不同的儲存空間。
Go 最基本的變數定義方式是使用 var
關鍵字, 其基本格式為:
var 變數名 資料型別
變數的宣告以關鍵字 var
開頭, 行尾不需要分號
比如說, 我們定義一個名稱為 hp
, 型別為 int
的變數(若不引用則報錯):
var hp int // int表示為整型
我們來宣告一個變數並列印一下看看:
package main import "fmt" func main() { // 使用 var 定義一個變數, 注意: 變數型別要放在變數名後面 var hp int fmt.Println(hp) } // 結果: 0
奇怪? 我都沒有給 hp 一個具體的值, 怎麼打印出來為 0 呢?
其實, 這是 Go 的一個特點: 當我們在宣告一個變數的時候, 如果沒有初始值, Go 會給其一個對應型別的預設值.
既然這樣, 我們就給 hp
一個值吧.
package main
import "fmt"
func main() {
// 使用 var 定義一個變數, 注意: 變數型別要放在變數名後面
var hp int
hp = 100 // 賦值操作
fmt.Println(hp)
}
// 結果:
100
當然了, 我們也可以在宣告變數的時候直接給 hp
一個值:
var hp int = 100 // 定義變數並初始化值
如果我們僅僅定義一個變數而沒有去使用它, 那麼Go就會報錯.
定義多個變數
// 定義兩個型別都是 int 的變數
var hp, mp int
你也可以這樣寫:
var (
hp int
mp int
)
既然可以同時定義多個變數, 那麼也能同時初始化多個變數
/*定義兩個型別都是"int"的變數, 並且分別初始化為相應的值
hp為100, mp為260
*/
var hp, mp int = 100, 260
自動推導型別
有沒有發現當我們定義變數時有一些繁瑣, 需要寫 型別
, Go允許我們不寫 型別
, 它會自動幫我們推匯出資料對應的型別:
var hp, mp = 100, 260
有人說了, 那個 var
能不能也去了, 每次都要寫, 好麻煩的. 沒問題, Go 也允許你(但是要把 = 換成 :=):
/*定義兩個變數,它們分別初始化為相應的值
hp為100, mp為260
編譯器會根據初始化的值自動推匯出相應的型別
*/
hp, mp := 100, 260 // 注意這裡有個冒號 :
現在是不是感覺非常簡潔了. :=
這個符號直接代替了變數的定義及賦值.
hp := 100
// 等價於下面兩行
var hp int
hp = 100
所謂自動推導型別,就是不用通過 var
宣告變數,不用指定型別,直接在變數名後面跟 :
號,同時完成賦值。
那麼GO會根據所賦的值自動推匯出變數的型別。如果給 hp
變數賦值為小數,那麼該變數的型別為小數型別(浮點)。
通過比較,我們發現這種方式比前面的賦值方式要簡單方便。這種方式,也是我們以後開發過程中最常用的方式。
不過它有一個限制, 那就是它只能用在函式內部; 在函式外部使用則會無法編譯通過, 所以一般用var
方式來定義全域性變數.
匿名變數
_
(下劃線)為匿名變數, 它會丟棄對應資料不進行處理. 匿名變數配合函式的返回值使用才有價值, 目前大家先知道其語法即可.
在下面的例子中, 我們將值 2
賦予 b
, 丟棄 3
_, b := 3, 2
匿名變數不佔用名稱空間, 不會分配記憶體.
匿名變數與匿名變數之間也不會因為多次宣告而無法使用.
小練習
有兩個變數 a 和 b,a 的值為 10,b 的值為 20,如何交換兩個變數的值?
方法一(傳統方式):
package main
import "fmt"
func main(){
a, b := 10, 20
var temp int
temp = a
a = b
b = temp
fmt.Println("a = ", a, "b = ", b)
}
方法二(多重賦值):
package main
import "fmt"
func main(){
a, b := 10, 20
a, b = b, a // 注意,這一行不需要 冒號
fmt.Println("a = ", a, "b = ", b)
}