Go語言變數的初始化

2022-04-11 10:13:47 字數 1763 閱讀 2795

當然,依然可以在變數宣告時賦予變數乙個初始值。

回顧c語言

在c語言中,變數在宣告時,並不會對變數對應記憶體區域進行清理操作。此時,變數值可能是完全不可預期的結果。開發者需要習慣在使用c語言進行宣告時要初始化操作,稍有不慎,就會造成不可預知的後果。

在網路上只有程式設計師才能看懂的「燙燙燙」和「屯屯屯」的梗,就**於c/c++中變數預設不初始化。

微軟的 vc 編譯器會將未初始化的棧空間以 16 進製的 0xcc 填充,而未初始化的堆空間使用 0xcd 填充,而 0xcccc 和 0xcdcd 在中文的 gb2312 編碼中剛好對應「燙」和「屯」字。

因此,如果乙個字串沒有結束符\0,直接輸出的記憶體資料轉換為字串就剛好對應「燙燙燙」和「屯屯屯」。

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)

**說明如下:

以上**輸出結果為:

3.4var 的變數宣告還有一種更為精簡的寫法,例如:

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程式中,初始化的幾個結構通常為 包 package 常量 const 變數 var init 和main 接下來我說一下這幾個結構的執行順序 go 程式的初始化順序見下圖 init main 是 go 語言中的保留函式,兩個函式在 go 語言中的區別如下 兩個函式在定義時不能有任何的引數和返回...

Go語言 變數的宣告 初始化等

變數基本型別 bool string int,int8,int16,int32,int64 uint,uint8,uint16,uint32,uint64,uintptr byte uint8的別名 rune int32的別名,代表乙個unicode碼 float32 float64 complex...

go結構體初始化 Go語言初始化結構體的成員變數

結構體在例項化時可以直接對成員變數進行初始化,初始化有兩種形式分別是以字段 鍵值對 形式和多個值的列表形式,鍵值對形式的初始化適合選擇性填充欄位較多的結構體,多個值的列表形式適合填充欄位較少的結構體。使用 鍵值對 初始化結構體 結構體可以使用 鍵值對 key value pair 初始化字段,每個 ...