go 語言在宣告變數時,自動對變數對應的記憶體區域進行初始化操作。每個變數會初始化其型別的預設值,例如:
var 變數名 型別 = 表示式例如,遊戲中,玩家的血量初始值為100。可以這樣寫:
var hp int = 100這句**中,hp 為變數名,型別為 int,hp 的初始值為 100。
上面**中,100 和 int 同為 int 型別,int 可以認為是冗餘資訊,因此可以進一步簡化初始化的寫法。
在標準格式的基礎上,將 int 省略後,編譯器會嘗試根據等號右邊的表示式推導 hp 變數的型別。
var hp = 100等號右邊的部分在編譯原理裡被稱做右值(rvalue)。
下面是編譯器根據右值推導變數型別完成初始化的例子。
var attack = 40
var defence = 20
var damagerate float32 = 0.17
var damage = float32(attack-defence) * damagerate
fmt.println(damage)
**說明如下:
預設情況下,如果不指定 damagerate 變數的型別,go 語言編譯器會將 damagerate 型別推導為 float64。由於這個例子中不需要 float64 的精度,所以強制指定型別為 float32。
以上**輸出結果為:
3.4
var 的變數宣告還有一種更為精簡的寫法,例如:
hp := 100這是 go 語言的推導宣告寫法,編譯器會自動根據右值型別推斷出左值的對應型別。
注意:由於使用了:=
,而不是賦值的=
,因此推導宣告寫法的左值變數必須是沒有定義過的變數。若定義過,將會發生編譯錯誤。
如果 hp 已經被宣告過,但依然使用:=時編譯器會報錯,**如下:
// 宣告 hp 變數
var hp int
// 再次宣告並賦值
hp := 10
編譯報錯如下:
no new variables on left side of :=
意思是,在「:=」的左邊沒有新變數出現,意思就是「:=」的左邊變數已經被宣告了。
短變數宣告的形式在開發中的例子較多,比如:
conn, err := net.dial(「tcp」,「127.0.0.1:8080」)
var conn net.conn
var err error
conn, err = net.dial("tcp", "127.0.0.1:8080")
因此,短變數宣告並初始化的格式在開發中使用比較普遍。
注意:在多個短變數宣告和賦值中,至少有乙個新宣告的變數出現在左值中,即便其他變數名可能是重複宣告的,編譯器也不會報錯,**如下:
conn, err := net.dial("tcp", "127.0.0.1:8080")
conn2, err := net.dial("tcp", "127.0.0.1:8080")
上面的**片段,編譯器不會報err重複定義。
本小節主要講解了不同變數的初始化時的預設值,編譯器是如何自動推導型別的格式,以及如何更簡短的宣告乙個變數並進行初始化。
Go語言從入門到精通 變數的初始化
go 語言在宣告變數時,自動對變數對應的記憶體區域進行初始化操作。每個變數會初始化其型別的預設值,例如 var 變數名 型別 表示式 例如,遊戲中,玩家的血量初始值為100。可以這樣寫 var hp int 100 這句 中,hp 為變數名,型別為 int,hp 的初始值為 100。上面 中,100...
Go語言從入門到精通 變數的宣告
變數 variable 的功能是儲存使用者的資料。不同的邏輯有不同的物件型別,也就有不同的變數型別。經過半個多世紀的發展,程式語言已經形成一套固定的型別,這些型別在不同的程式語言中基本是相通的。常見變數的資料型別有 整型 浮點型 布林型 結構體等。go 語言作為c語言家族的新派代表,在c語言的定義方...
Go語言從入門到精通 變數的宣告
變數 variable 的功能是儲存使用者的資料。不同的邏輯有不同的物件型別,也就有不同的變數型別。經過半個多世紀的發展,程式語言已經形成一套固定的型別,這些型別在不同的程式語言中基本是相通的。常見變數的資料型別有 整型 浮點型 布林型 結構體等。go 語言作為c語言家族的新派代表,在c語言的定義方...