本系列文章並不會停留在go語言的語法層面,更關注語言特性、學習和使用**現的問題以及引起的一些思考。
初始化順序:當前包級別變數 -> 匯入外部包的init() -> 當前包內的init() -> main()。通常可將乙個包匯入但是不使用的方式,初始化某些配置資料。
下面這段**會執行config包和model包下的init()方法:
import
("cmdb-bg/cmd"
_"cmdb-bg/config"
_"cmdb-bg/model"
)
我們都知道,當我們僅僅宣告乙個變數、但未對其進行初始化的時候,go會給每種變數型別賦乙個零值:
func
main()
如果你之前已經使用了":=「對某個變數進行了宣告與初始化,如果你想再次為這個變數進行重新賦值,切記不要加」:"
func
main()
func
main()
}
go中可以用如下方式高效交換兩個變數的值:
func
main()
func
main()
if賦值加判斷復合語句的作用域:f的作用域會被限制在if大括號所包裹的**塊內。在if的外部並不能使用變數f:
funcf1(
)error
fmt.
println
(f)// 編譯不通過: undefined: f
}// 解決:
funcf1(
)error
f.close()
// ok
}
int和int32是不同型別,若要把int當成int32來使用,必須進行強制型別轉換。其他型別同理。
型別斷言的使用(暫作了解):
func
main()
時,可以賦值給他任意型別
var a inte***ce
a =2;
// 型別斷言會返回兩個值
v, ok := a.
(int
)// 如果變數a是斷言的型別,ok為true,v為被斷言變數的值。
// 否則ok為false,v為斷言型別的零值
fmt.
println
(v, ok)
// 2 true
}
如果進行算術運算之後發生了溢位,那麼go會直接丟掉溢位的高位部分。
所有基本型別的值都是可以比較的(整型、浮點型),其他高階型別的比較,一部分需要遵循一定規則,而一部分高階型別是禁止比較的。
不同資料型別不能直接做運算。不像其他語言,go語言沒有隱式型別轉換。要想強制對不同型別做運算,必須進行顯式的強制型別轉換。轉換成同一種型別之後,才能做運算:
func
main()
在進行強制型別轉換時需要注意:當整數值的型別的有效範圍由寬變窄時,會截掉一定數量的高位二進位制數。與這個類似的還有把乙個浮點數型別的值轉換為整數型別值時,浮點數型別的小數部分會被全部截斷:
func
main()
浮點數的精度有限,盡量不要做浮點數運算結果的比較:
func
main()
iota常量讓用二進位制位做標記更簡單了。在第乙個宣告的常量所在的行,iota將會被置為0,然後在每乙個有常量宣告的行加一:
const
( flagup flags =
1<<
iota
// 第一種標記
flagbroadcast // 第二種標記
flagloopback // 第三種標記
flagpointtopoint // 第四種標記
flagmulticast // 第五種標記
)
【go語言踩坑系列(二)】字串 GO語言基本資料型別
任何go語言原始碼檔案都由若干個程式實體組成的。在go語言中,變數 常量 函式 結構體和介面被統稱為 程式實體 而它們的名字被統稱為 識別符號 識別符號可以是任何unicode編碼可以表示的字母字元 數字以及下劃線 不過,首字母不能是數字或下劃線。注意 在go語言中,我們對程式實體的訪問許可權控制只...
Go語言基本資料型別(四)
go語言基本資料型別主要包含 bool,number,string go中的布林型別,只能是 true 和 false,例如 var b bool true 型別描述 uint8 無符號 8位整型 0 到 255 uint16 無符號 16位整型 0 到 65535 uint32 無符號 32位整型...
Go語言基礎之基本資料型別
go語言中有豐富的資料型別,除了基本的整型 浮點型 布林型 字串外,還有陣列 切片 結構體 函式 map 通道 channel 等。go 語言的基本型別和其他語言大同小異。目錄整型分為以下兩個大類 按長度分為 int8 int16 int32 int64 對應的無符號整型 uint8 uint16 ...