由于本人一直使用 PHP 語言進行開發,在學習 Go 的過程中發現有些知識點經常混淆,遂将 Go 與 PHP 做了比較(僅限于二者的基本資料類型)。
這是 Go 學習筆記的第一篇,主要是 Go 基本資料類型的學習總結。
Go | PHP | ||
基本資料類型 | 布爾型 數字類型:
字元串類型 派生類型:
| 4 種标量類型:
| |
字元串 | 位元組編碼 |
|
|
字元串定義 |
|
| |
字元串長度 | len() :擷取的是每個字元的 UTF-8 編碼的長度和,而不是直接的字元數量。 如 len("hello,世界") 的結果是 12 不是 8 | strlen() :與 Go 的 len() 類似,得到的是字元串所占的位元組數 | |
utf8.RuneCountInString() :擷取字元串的真正長度,上面的 utf8.RuneCountInString("hello,世界") 的結果是 8。 注:需import "unicode/utf8" | 擷取字元串的真正長度可以使用下面兩個函數:
| ||
字元串拼接 | 運算符 + :
| 運算符 . :
| |
fmt.Sprintf():
| |||
strings.Join()
| |||
bytes.Buffer——優先推薦
| |||
strings.Builder——推薦
| |||
數組 | 聲明數組 |
① var arr [2]int //var 數組名稱 [數組長度]數組元素類型 ② var arr = [2]int{1,2} //var 數組名稱 = [數組長度]數組元素類型{元素1,元素2,...} ③ var arr = [5]string{3: "ab", 4: "cd"} //指定索引位置 ④ var arr = [...]int{1,2} //var 數組名稱 = [...]數組元素類型{元素1,元素2,...},不定長數組聲明方式 ⑤ new():建立的是數組引針,eg. var arr1 = new([5]int) |
如果是 Go,會報錯: |
值傳遞和 引用傳遞 | new([5]int)建立的是數組指針,arr和arr1指向同一位址,故而修改arr1時arr同樣也生效; 而newarr是由arr2值傳遞(拷貝),故而修改任何一個都不會改變另一個的值。 | 達到與左側相同的效果,PHP 代碼如下: PHP中的引用傳遞使用 & 符号。 | |
切片 | 定義 |
| PHP中沒有切片這個概念,但是在數組函數中有個 array_slice() 函數,可以根據 offset 和 length 傳回指定的數組中的一段序列。與 Go 的切片相似。 |
聲明 | ① 切分數組 var arr = [5]int{1,2,3,4,5} //數組 var s []type = arr[start:end:max] //切片(包含數組start到end-1之間的元素),end-start表示長度,max-start表示容量 ② 初始化 var s = []int{2, 3, 5, 7, 11} //建立了一個長度為 5 的數組并且建立了一個相關切片。 ③ 切片重組 var s []type = make([]type, len, cap) //len 是數組的長度也是切片的初始長度,cap是容量,可選參數 簡寫為slice := make([]type, len) | ||
字典 |
| PHP的關聯數組類似于 Go 的 Map。 | |
① var mapName map[keyType]valueType ② var mapName map[keyType]valueType{k1:v1, k2:v2, ...} ③ var mapName = make(map[keyType]valueType, cap) //cap是可選參數,表示容量 |
其實 Go 的基本資料類型的知識點以及它和 PHP 的差別絕不止上面列出的這些,對比新舊兩種語言的差别意義也不是很大,但對我來說,通過梳理可以達到溫故知新的目的。