1.3 基本類型
更明確的數字類型命名,支持 Unicode,支持常用數據結構。
常用數據結構
支持八進制、十六進制,以及科學記數法。標準庫 math 定義了各數字類型取值范圍。
a, b, c, d := 071, 0x1F, 1e9, math.MinInt16
空指針值 nil,而非 C/C++ NULL。
1.4 引用類型
引用類型包括 slice、map 和 channel。它們有復雜的內部結構,除了申請內存外,還需要初始化相關屬性。
內置函數 new 計算類型大小,為其分配 零值內存 ,返回指針。而 make 會被編譯器翻譯成具體的創建函數,由其分配內存和初始化成員結構,返回 對象 而 非指針。
a := []int{0, 0, 0} // 提供初始化表達式。
a[1] = 10
b := make([]int, 3) // make slice
b[1] = 10
c := new([]int)
c[1] = 10 // Error: invalid operation: c[1] (index of type *[]int)
有關引用類型具體的內存布局,可參考后續章節。
1.5 類型轉換 ( 簡單記錄 )
不支持隱式類型轉換,即便是從窄向寬轉換也不行。
var b byte = 100
var n int = b // Error: cannot use b (type byte) as type int in assignment
var n int = int(b) // 顯式轉換
使用括號避免優先級錯誤。
*Point(p) // 相當于 *(Point(p))
(*Point)(p)
<-chan int(c) // 相當于 <-(chan int(c))
(<-chan int)(c)
同樣不能將其他類型當 bool 值使用。
a := 100
if a { // Error: non-bool a (type int) used as if condition
println("true")
}