Go語言從入門到精通 變數的初始化

2021-09-12 20:58:45 字數 1878 閱讀 7889

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語言的定義方...