當然,依然可以在變數宣告時賦予變數乙個初始值。
回顧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 初始化字段,每個 ...