這是 Go 學習筆記的第一篇,主要是 Go 基本數據類型的學習總結。
由於本人一直使用 PHP 語言進行開發,在學習 Go 的過程中發現有些知識點經常混淆,遂將 Go 與 PHP 做了比較(僅限於二者的基本數據類型)。
|
Go
|
PHP
|
|
基本數據類型
|
布爾型
數字類型:
字符串類型
派生類型:
|
4 種標量類型:
3 種復合類型:
2 種特殊類型:
|
|
字符串
|
字節編碼
|
|
|
字符串定義
|
|
|
|
字符串長度
|
len() :獲取的是每個字符的 UTF-8 編碼的長度和,而不是直接的字符數量。 如 len("hello,世界") 的結果是 12 不是 8 |
strlen() :與 Go 的 len() 類似,得到的是字符串所占的字節數 | |
utf8.RuneCountInString() :獲取字符串的真正長度,上面的 utf8.RuneCountInString("hello,世界") 的結果是 8。 注:需import "unicode/utf8" |
獲取字符串的真正長度可以使用下面兩個函數:
|
||
字符串拼接
|
運算符 + :
str := "hello, " + "world"
|
運算符 . :
$str = "hello, " . "world"; // 也可以寫成:
|
|
fmt.Sprintf():
fmt.Sprintf("%d:%s", 2018, "年")
|
|||
strings.Join()
strings.Join([]string{"hello", "world"}, ", ")
|
|||
bytes.Buffer——優先推薦
var buffer bytes.Buffer buffer.WriteString("hello") buffer.WriteString(", ") buffer.WriteString("world") fmt.Print(buffer.String())
|
|||
strings.Builder——推薦
var b1 strings.Builder b1.WriteString("ABC") b1.WriteString("DEF") fmt.Print(b1.String())
|
|||
數組
|
聲明數組
|
① 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)
|
$arr = ['a', 'b', 'c', 123];
如果是 Go,會報錯:
# command-line-arguments ./arr.go:6:34: cannot use 123 (type int) as type string in array or slice literal |
值傳遞和
引用傳遞
|
var arr1 = new([5]int) arr := arr1 arr1[2] = 100 fmt.Println(arr1[2], arr[2]) var arr2 [5]int newarr := arr2 arr2[2] = 100 fmt.Println(arr2[2], newarr[2]) 程序輸出: 100 100 100 0
new([5]int)創建的是數組指針,arr和arr1指向同一地址,故而修改arr1時arr同樣也生效;
而newarr是由arr2值傳遞(拷貝),故而修改任何一個都不會改變另一個的值。
|
達到與左側相同的效果,PHP 代碼如下:
$arr1 = [5, 10, 0, 20, 25]; $arr = &$arr1; //引用傳遞 $newArr = $arr1; //值傳遞 $arr1[2] = 100; echo $arr1[2], $arr[2]; echo $arr1[2], $newArr[2]; 程序輸出: 100 100 100 0
PHP中的引用傳遞使用 & 符號。
|
|
切片
|
定義
|
|
PHP中沒有切片這個概念,但是在數組函數中有個 array_slice() 函數,可以根據 offset 和 length 返回指定的數組中的一段序列。與 Go 的切片相似。
$input = array("a", "b", "c", "d", "e"); $output = array_slice($input, 0, 3); // returns "a", "b", and "c" |
聲明
|
① 切分數組
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 的區別絕不止上面列出的這些,對比新舊兩種語言的差別意義也不是很大,但對我來說,通過梳理可以達到溫故知新的目的。