這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
看《Go入門指南》 ,這裡講得比較基礎,針對go 1.0版,以下是一些我自己覺得特別和不容易理解的地方的摘抄!
上次有說到go裡不同類型之間操作必須顯示轉換,int和uint不固定,所以int 不是int32
格式化說明符(應該不止這些)
在格式化字串裡,%d
用于格式化整數(%x
和 %X
用于格式化 16 進位表示的數字),%g
用于格式化浮點型(%f
輸出浮點數,%e
輸出科學計數標記法),%0d
用於規定輸出定長的整數,其中開頭的數字 0 是必須的。
%n.mg
用於表示數字 n 並精確到小數點後 m 位,除了使用 g 之外,還可以使用 e 或者 f,例如:使用格式化字串 %5.2e
來輸出 3.4 的結果為 3.40e+00
。
%b
是用於表示位的格式化標識符。
4.5.2.3 位元運算 (備檔)
位元運算只能用於整數類型的變數,且需當它們擁有等長位元模式時。
%b
是用於表示位的格式化標識符。
二元運算子
按位與 &
:
對應位置上的值經過和運算結果,具體參見和運算子,第 4.5.1 節,並將 T(true)替換為 1,將 F(false)替換為 0
1 & 1 -> 11 & 0 -> 00 & 1 -> 00 & 0 -> 0
按位或 |
:
對應位置上的值經過或運算結果,具體參見或運算子,第 4.5.1 節,並將 T(true)替換為 1,將 F(false)替換為 0
1 | 1 -> 11 | 0 -> 10 | 1 -> 10 | 0 -> 0
按位異或 ^
:
對應位置上的值根據以下規則群組合:
1 ^ 1 -> 01 ^ 0 -> 10 ^ 1 -> 10 ^ 0 -> 0
位清除 &^
:將指定位置上的值設定為 0。
一元運算子
當希望把結果賦值給第一個運算元時,可以簡寫為 a <<= 2
或者 b ^= a & 0xffffffff
。
位左移常見實現儲存單位的用例
使用位左移與 iota 計數配合可優雅地實現儲存單位的常量枚舉:
type ByteSize float64const ( _ = iota // 通過賦值給空白標識符來忽略值 KB ByteSize = 1<<(10*iota) MB GB TB PB EB ZB YB)
在通訊中使用位左移表示標識的用例
type BitFlag intconst ( Active BitFlag = 1 << iota // 1 << 0 == 1 Send // 1 << 1 == 2 Receive // 1 << 2 == 4)flag := Active | Send // == 3
4.5.2.5 算術運算子
對於整數和浮點數,你可以使用一元運算子 ++
(遞增)和 --
(遞減),但只能用於尾碼,同時,帶有 ++
和 --
的只能作為語句
在運算時 溢出 不會產生錯誤
4.5.4 類型別名
當你在使用某個類型時,你可以給它起另一個名字,然後你就可以在你的代碼中使用新的名字(用於簡化名稱或解決名稱衝突)。
在 type TZ int
中,TZ 就是 int 類型的新名稱(用於表示程式中的時區),然後就可以使用 TZ 來操作 int 類型的資料。
Example 4.11 type.go
package mainimport “fmt”type TZ intfunc main() { var a, b TZ = 3, 4 c := a + b fmt.Printf(“c has the value: %d”, c) // 輸出:c has the value: 7}
實際上,類型別名得到的新類型並非和原類型完全相同,新類型不會擁有原類型所附帶的方法(第 10 章);TZ 可以自訂一個方法用來輸出更加人性化的時區資訊。
練習 4.5 定義一個 string
的類型別名 Rope
,並聲明一個該類型的變數。
4.5.5 字元類型
嚴格來說,這並不是 Go 語言的一個類型,字元只是整數的特殊用例。byte
類型是 uint8
的別名,對於只佔用 1 個位元組的傳統 ASCII 編碼的字元來說,完全沒有問題。例如:var ch byte = 'A'
;字元使用單引號括起來。
在 ASCII 碼錶中,A 的值是 65,而使用 16 進位表示則為 41,所以下面的寫法是等效的:
var ch byte = 65 或 var ch byte = ‘\x41’
(\x
總是緊跟著長度為 2 的 16 進位數)
另外一種可能的寫法是 \
後面緊跟著長度為 3 的十進位數,例如:\377
。
不過 Go 同樣支援 Unicode(UTF-8),因此字元同樣稱為 Unicode 代碼點或者 runes,並在記憶體中使用 int 來表示。在文檔中,一般使用格式 U+hhhh 來表示,其中 h 表示一個 16 進位數。其實 rune
也是 Go 當中的一個類型,並且是 int32
的別名。
在書寫 Unicode 字元時,需要在 16 進位數之前加上首碼 \u
或者 \U
。
因為 Unicode 至少佔用 2 個位元組,所以我們使用 int16
或者 int
類型來表示。如果需要使用到 4 位元組,則會加上 \U
首碼;首碼 \u
則總是緊跟著長度為 4 的 16 進位數,首碼 \U
緊跟著長度為 8 的 16 進位數。
Example 4.12 char.go
var ch int = ‘\u0041’var ch2 int = ‘\u03B2’var ch3 int = ‘\U00101234’fmt.Printf(“%d - %d - %d\n”, ch, ch2, ch3) // integerfmt.Printf(“%c - %c - %c\n”, ch, ch2, ch3) // characterfmt.Printf(“%X - %X - %X\n”, ch, ch2, ch3) // UTF-8 bytesfmt.Printf(“%U - %U - %U”, ch, ch2, ch3) // UTF-8 code point
輸出:
65 - 946 - 1053236A - β - r41 - 3B2 - 101234U+0041 - U+03B2 - U+101234
格式化說明符 %c
用於表示字元;當和字元配合使用時,%v
或 %d
會輸出用於表示該字元的整數;%U
輸出格式為 U+hhhh 的字串(另一個樣本見第 5.4.4 節)。
包 unicode
包含了一些針對測試字元的非常有用的函數(其中 ch
代表字元):
判斷是否為字母: unicode.IsLetter(ch)判斷是否為數字: unicode.IsDigit(ch)判斷是否為空白符號: unicode.IsSpace(ch)
這些函數返回一個布爾值。包 utf8
擁有更多與 rune 相關的函數。