一、前言
go语言也出来有一些年头了,按理说我们身为程序员,是应该身先士卒的去学习它,奈何博主之前总是不敢学,害怕php都掌握的不牢靠,学go语言相当于邯郸学步,最后把php都给忘了(博主刚入行一年的时候学习python,结果写程序的时候果断弄混了,哈哈哈)。
行吧,趁着最近闲下来,看了一些go的入门文档,这边稍微总结下go和php的区别吧,都是比较浅显的一些区别,不涉及原理,只是入门笔记~
二、正文
1、 go程序不用在每行的后面加分号:;
2、 go程序的函数括号: { 不能单独在一行,不然会报错
3、 go程序的派生类型比较多,且对于数据类型的定位更为精准。比如int和uint,int8等,比起php只有一个int类型,go要严谨的多
4、 go每增加一个新变量都是要显式声明的,比如 var a int = 50; 也可以用 a :=50;来声明。php使用变量是不用声明的
go声明变量的例子:
b := false //布尔型
i := 1 //整型
f := 0.618 //浮点型
c := 'a' //字符
s := "hello" //字符串
cp := 3+2i //复数
i := [3]int{1,2,3} //数组 (特别注意下数组的声明格式: arr := []int{})
5、 go声明变量之后,不指明变量类型的话,则会自己推断所属类型。如果给出类型,例如 var x,y int 此处没有给出x,y指定的值,则默认为0。bool类型的默认值为:false
6、 在go中,全局变量声明之后,可以不被使用。如果是方法体中的局部变量,声明之后必须要在下面使用,不然会编译错误
7、 go中有个空白标识符,也被用于抛弃值:空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。
8、 go中相同类型之间的变量可以同时声明,例如:var x,y int 如果类型不同的话,不能同时声明,不然编译报错
9、 go中的常量可以通过枚举,一个const定义多个常量。常量中的赋值部分也可以采用go内置的一些函数来进行计算。不是内置函数则编译失败。如果没有给常量定义值
则会默认使用上一个被定义的常量的值,例如:
const (
a = 1
b
c
d
)
打印出来的结果为:1 , 1 ,1 ,1 (如果定义b =2,则打印结果的c和d都为2,会默认使用上一个被定义的常量的值)
10、 字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度,这两部分每部分都是 8 个字节,所以字符串类型大小为 16 个字节。a = “hello” unsafe.Sizeof(a)//16
11、 go中的" i=1<<0, j=3<<1"这里的"<
12、 go的位运算符是二进制之间的计算,需要先熟练掌握二进制之间的算法!!!!!
13、 关于go的fmt包格式化字符串的格式参数:https://blog..net/tennysonsky/article/details/77988969 (类似于 %T 可以输出变量的类型int,string等)
14、 关于go中的&a是取变量a对应的内存地址。
& :仅用于生成其操作数对应的地址,也就是用于生成指针
* :会出现在两个内容上:
一个是类型, * Type 这样的格式代表了一个指针类型
一个是指针, * Pointer 这样的格式用于获取指针所对应的基本值
15、 go的循环语法和php差不多,多了一个select循环,类似于switch循环,只不过select循环中的case都是要进行io操作的,而且当case都不满足条件的时候,会堵塞
参考博客:https://blog..net/wo198711203217/article/details/65442288
其次是go中的语言条件语句的条件部分是没括号的。例如: if 布尔表达式 { } 这里的条件部分是没括号的
16、 go的函数是通过func来定义的,且函数的参数,返回值等都需要定义好类型。也可以定义返回多个值的类型,例如:
func swap(x, y string) (string, string) {
return y, x
}
而php的函数是通过function来定义的。虽然php 7.0之后也可以定义返回类型,但是定义返回类型的格式稍有不同,一般是:
function():array {} 代表返回数组
17、 go程序中的
答:
goroutine是golang中在语言级别实现的轻量级线程,仅仅利用 go 就能立刻起一个新线程。多线程会引入线程之间的同步问题,在golang中可以使用channel作为同步的工具。通过channel可以实现两个goroutine之间的通信。
创建一个channel, make(chan TYPE {, NUM}) , TYPE指的是channel中传输的数据类型,第二个参数是可选的,指的是channel的容量大小。
向channel传入数据, CHAN
从channel读取数据, DATA :=
当
相反 chan
18、 关于形参和实参的区别 :
https://blog..net/qq_33187168/article/details/50346465
19、 go程序中的打印,如果直接使用fmt.Printf()的话,就会把打印内容输出到后台,无法直接在浏览器观看,所以要实现类似于php中的echo 的是:
使用fmt.Fprint(this.Ctx.ResponseWriter, name)进行输出时,只输出变量,即便是设置了模板,模板也不会显示的。(这个有待测试,因为貌似需要用到beego,
需要进行http请求,然后获取响应。我这边只是初级入门,自己在本地编译一些简单的程序,无法测试)
如果是要实现类似于php中的exit,断点打印的话,使用go的一个os包: os.Exit(0) (PS:这个可以直接使用的)
以上就是博主在学习go语言的时候,顺手记下来的一些东西,整体来讲差别没想象中的那么大,万变不离其宗吧,先掌握语法再说。
推荐入门笔记:
《go语言实战笔记系列》
end