基礎資料類型
整型
int,uint是根據CPU平台機器字大小決定取值範圍。
& 位元運算 AND| 位元運算 OR^ 位元運算 XOR&^ 位清空 (AND NOT)<< 左移>> 右移
預設值
var a1 int //0 var a2 float64 //0 var a3 bool //false var a4 byte //0 var a5 rune //0 var a6 []int //[] var a7 []byte //[] var a8 map[int64]int64 //map[] var a9 string //空 var a10 complex64 //(0+0i)
溢出情況
一個算術運算的結果,不管是有符號或者是無符號的,如果需要更多的bit位才能正確表示的話,就說明計算結果是溢出了。超出的高位的bit位部分將被丟棄。如果原始的數值是有符號類型,而且最左邊的bit位是1的話,那麼最終結果可能是負的,例如int8的例子
var u uint8 = 255fmt.Println(u, u+1, u*u) // "255 0 1"var i int8 = 127fmt.Println(i, i+1, i*i) // "127 -128 1"
類型轉換
對於每種類型T,如果轉換允許的話,類型轉換操作T(x)將x轉換為T類型。許多整數之間的相互轉換並不會改變數值;它們只是告訴編譯器如何解釋這個值。但是對於將一個大尺寸的整數類型轉為一個小尺寸的整數類型,或者是將一個浮點數轉為整數,可能會改變數值或丟失精度:
f := 3.645 // a float64 i := int(f) fmt.Println(f, i) // "3.141 3" f = 1.99 fmt.Println(int(f)) // "1"
fmt提示
fmt的兩個提示。通常Printf格式化字串包含多個%參數時將會包含對應相同數量的額外運算元,但是%之後的[1]副詞告訴Printf函數再次使用第一個運算元。第二,%後的#副詞告訴Printf在用%o、%x或%X輸出時產生0、0x或0X首碼。
ascii := 'a'unicode := '國'newline := '\n'fmt.Printf("%d %[1]c %[1]q\n", ascii) // "97 a 'a'"fmt.Printf("%d %[1]c %[1]q\n", unicode) // "22269 國 '國'"fmt.Printf("%d %[1]q\n", newline) // "10 '\n'"
string
一個字串是一個不可改變的位元組序列。
s := "hello, world" fmt.Println(len(s)) // "12" fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w') fmt.Println(s[:5]) // "hello" fmt.Println(s[7:]) // "world" fmt.Println(s[:]) // "hello, world"
字串可以用==和<進行比較;比較通過逐個位元組比較完成的,因此比較的結果是字串自然編碼的順序。
因為字串是不可修改的,因此嘗試修改字串內部資料的操作也是被禁止的:
s[0] = 'L' // compile error: cannot assign to s[0]
編碼方式
ASCII
最早時期,ASCII是7bit,只能擺哦事128個字元。無法表示出全世界各個國家的字元,所以有了Unicode
Unicode
使用4Byte,32bit,可以表示更多的字元。但是會造成浪費空間,有的字元只需要8bit就夠了。於是,有了UTF-8
UTF-8
是一個變長編碼。
UTF8編碼使用1到4個位元組來表示每個Unicode碼點,ASCII部分字元只使用1個位元組,常用字元部分使用2或3個位元組表示。每個符號編碼後第一個位元組的高端bit位用於表示總共有多少編碼個位元組。如果第一個位元組的高端bit為0,則表示對應7bit的ASCII字元,