本文主要讲述php与golang的一些区别
前言
在学习一门比较新的语言时候,就像看着孩子长大一样,虽然有很多功能很棒,但是很多东西同样很不完善。
写这篇文章的时候用的是 go 1.14版本 !
写这篇文章的时候用的是 go 1.14版本 !
写这篇文章的时候用的是 go 1.14版本 !
包管理
以前php是用composer管理包的,很方便,然后包是放在项目下vendor目录,然后一开始golang的包是放在中央,也就是所有项目的包都放在一个位置,很不习惯,但是后来想了想python的包也是放在一个位置的呀,包管理难用是因为go之前包管理没有版本管理和其它原因,好在现在官方出了go module,包管理方便了很多。
泛型
php是动态语言,所以就没有泛型这些概念,泛型是静态语言的概念,可以说泛型是静态语言为了提高开发效率做的一个东西。
interface能够接收任何类型的参数,那他是不是泛型呢
如图可以看出a和b是无法做运算的,
但是可以通过interface自己实现简单的泛型
https://zhuanlan.zhihu.com/p/74525591
关于泛型可以看一下这个视频
https://www.bilibili.com/video/BV1k7411R7ya
听说go2就要出泛型了,其实这是有一个平衡点的,要出泛型,编译系统就会变得复杂起来,运行效率也会降低一些。在很多年前,go官方就着手设计泛型了,只是还没设计出一个比较好的泛型。
错误处理与异常
try-catch
golang没有try-catch,从网上各种说try-catch不好,也有说try-catch好的,有从性能角度考虑的,有代码健壮性考虑的等等方面。
我的感觉是try-catch挺好的,借用网友的一句话。
只有错误可预知时才用try。所有不可预知的错误用try都是不负责任的写法
就比如,因为服务器性能不行,数据库时不时出现连接失败,那我先用try catch先保证系统的稳定性,然后去解决性能的问题,所以这个问题是预知的。
那假如我不知道会有什么错误,我就强行加个try catch,只能说明懒的去解决错误了。
如果是代码的问题导致的bug,那说明你没对代码进行全面的测试。
如果是系统性能的问题,那说明你对系统的没有很好的了解。
那其实我们平时也很少用try-catch。
错误处理
首先go的错误处理首先让我们感觉就很多
if err != nil {
fmt.PrintLn("错误")
}
go函数一般有两个返回值,第二是err,这样把逻辑和错误区分开来,挺好的,当然你不想处理你可以用下划线“_”过掉。那根之前其实没有太大的区别。
类
golang没有类的概念,但是可以通过结构体和函数来实现,结构相当于定义类的字段,函数相当于成员方法。
golang没有继承,但是可以通过结构体嵌入实现类似的功能。
golang也没有 private,public这些关键字,而是通过函数名首字母大小写区别,大写就是开放,小写就私有。
多线程
以前用php想用多线程的时候折腾了一会,很麻烦,后来改用go写了,自带语言级别的多线程确实很香。go开启的是协程,协程和线程有些区别。
语法糖
defer
在代码前加上defer关键字,这段代码就会在整个函数结束之后运行。这有一个好处就是,比如你打开了数据库,就立马在下面写上defer db.Close()
,就能够很好避免因为忘记写关闭代码导致的问题。至于还有没有其它作用就看后面慢慢学习了。golang 的多返回值语法糖避免了这种方式带来的不便,错误值一般作为返回值列表的最后一个,其他返回值是成功执行时需要返回的信息
多返回值
多返回值,可以使返回值进行拆分,不至于聚集在一个返回值,会乱。
其它
变量类型放在了变量后面