由于本人一直使用 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 的区别绝不止上面列出的这些,对比新旧两种语言的差别意义也不是很大,但对我来说,通过梳理可以达到温故知新的目的。