1. 什麼是變量?
我們應該怎麼去理解變量? 在這裏我要舉一個例子:
大家應該都知道王者榮耀這個遊戲. 當我們在玩王者榮耀的時候, 我們操控的英雄的血量是不斷變化的, 這個血量是存在內存中的. 那麼這個血量就是一個變量.
在程序運行的過程中, 其值可以改變的量, 我們就稱爲變量.
通過上面例子可以發現:
- 變量是存儲在內存中的
- 變量是可以改變的
我們說變量是存儲在內存中, 那麼內存又是什麼呢?
內存是一個連續的數據集合, 每一個內存存儲區域都有一個唯一的地址標識, 稱爲內存地址. 就好比我們的身份證一樣, 每個人都有一個唯一的身份證.
我們知道了變量是什麼, 那麼在Go語言中, 變量應該如何定義呢?
2. 變量
2.1 變量的定義
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就會報錯.
2.2 定義多個變量
// 定義兩個個類型都是int的變量
var hp, mp int
既然可以同時定義多個變量, 那麼也能同時初始化多個變量
/*定義兩個類型都是"int"的變量, 並且分別初始化爲相應的值
hp爲100, mp爲260
*/
var hp, mp int = 100, 260
2.3 自動推導類型
有沒有發現當我們定義變量時有一些繁瑣, 需要寫類型
, Go允許我們不寫 類型
, 它會自動幫我們推導出數據對應的類型:
var hp, mp = 100, 260
有人說了, 那個 var
能不能也去了, 每次都要寫, 好麻煩的. 沒問題, Go也允許你:
/*定義兩個變量,它們分別初始化爲相應的值
hp爲100, mp爲260
編譯器會根據初始化的值自動推導出相應的類型
*/
hp, mp := 100, 260 // 注意這裏有個冒號 :
現在是不是感覺非常簡潔了. :=
這個符號直接代替了變量的定義及賦值.
hp := 100
// 等價於下面兩行
var hp int
hp = 100
不過它有一個限制, 那就是它只能用在函數內部; 在函數外部使用則會無法編譯通過, 所以一般用var
方式來定義全局變量.
2.4 匿名變量
_
(下劃線)爲匿名變量, 它會丟棄對應數據不進行處理. 匿名變量配合函數的返回值使用纔有價值, 目前大家先知道其語法即可.
在下面的例子中, 我們將值 2
賦予 b
, 丟棄 3
_, b := 3, 2
匿名變量不佔用命名空間, 不會分配內存.
匿名變量與匿名變量之間也不會因爲多次聲明而無法使用.
2.5 變量命名規範
- 變量只能由字母、數字、下劃線組成。
- 不能以數字開頭。
- 不能是Go中的關鍵字及保留字
- 大小寫區分,
a := 1
和A := 1
是兩個變量。
以上要求是必須滿足的,下面的要求要儘量做到
- 變量名要有描述性,要簡潔、易讀,不宜過長。
- 變量名不能使用中文以及拼音。
- 推薦使用的變量名:
- 下劃線:my_name = 'Conan'
- 駝峯體:MyName = 'Conan'
Go語言中的25個關鍵字:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Go語言中的37個保留字:
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete
complex real imag
panic recover