php7与go语言性能 php vs go( 五 )


你可以把 panic() 当作是 throw (丢出错误),而这跟PHP的 exit() 有87%像,一但你执行了 panic() 你的程式就会宣告而终,但是别担心 , 因为程式结束的时候会呼叫 defer,所以我们接下来要在 defer 停止 panic()。
关于 defer 上述已经有提到了,他是一个反向执行的宣告,会在函式结束后被执行,当你呼叫了 panic() 结束程式的时候,也就会开始执行 defer ,所以我们要在 defer 内使用 recover() 让程式不再继续进行结束动作,这就像是捕捉异常 。
recover() 可以看作 catch (捕捉) , 我们要在 defer 里面用 recover() 解决 panic(),如此一来程式就会回归正常而不会被结束 。
还记得在PHP里要引用一堆档案的日子吗?到处可见的 require() 或是 include() ?到了Golang这些都不见了,取而代之的是「套件(Package)」 。现在让我们来用PHP解释一下 。
这看起来很正常对吧?但假设你有一堆档案,这马上就成了 Include Hell ,让我们看看Golang怎么透过「套件」解决这个问题 。
「 蛤???杀?。浚浚?」你可能如此地说道 。是的,main.go 中除了引用 fmt 套件( 为了要输出结果用的套件 )之外完全没有引用到 a.go。
「 蛤???杀?。浚浚浚浚浚?」你仿佛回到了几秒钟前的自己 。
既然没有引用其他档案 , 为什么 main.go 可以输出 foo 呢?注意到了吗 ,  两者都是属于 main 套件 ,因此 他们共享同一个区域,所以接下来要介绍的是什么叫做「套件」 。
套件是每一个 .go 档案都必须声明在Golang原始码中最开端的东西,像下面这样:
这意味着目前的档案是属于 main 套件( 你也可以依照你的喜好命名 ),那么要如何让同个套件之间的函式沟通呢?
接着是Golang;注意!你不需要引用任何档案,因为下列两个档案同属一个套件 。
一个由「套件」所掌握的世界,比起PHP的 include() 和 require() 还要好太多了,对吗?
在Golang 中没有引用单独档案的方式,你必须汇入一整个套件,而且你要记?。骸敢欢慊闳肓?nbsp;, 你就一定要使用它」 , 像下面这样 。
假如你不希望使用你汇入的套件,你只是为了要触发那个套件的 main() 函式而引用的话??,那么你可以在前面加上一个底线( _ ) 。
如果你的套件出现了名称冲突,你可以在套件来源前面给他一个新的名称 。
现在你知道可以汇入套件了,那么什么是「汇出」?同个套件内的函式还有共享变数确实可以直接用,但那 并不表示可以给其他套件使用 ,其方法取决于 函式/变数的「开头大小写」。
是的 。Golang依照一个函式/变数的开头大小写决定这个东西是否可供「汇出」。
这用在区别函式的时候格外有用 , 因为小写开头的任何事物都是不供汇出的,反之,大写开头的任何事物都是用来汇出供其他套件使用的 。
一开始可能会觉得这是什么奇异的规定,但写久之后,你就能发现比起JavaScript和Python以「底线为开头的命名方式」还要来得更好;比起成天宣告 public 、 private 、 protected 还要来得更快 。
在Golang 中没有类别,但有所谓的「建构体(Struct)」和「接口(Interface)」,这就能够满足几乎所有的需求了,这也是为什么我认为Golang 很简洁却又很强大的原因 。
让我们先用PHP 建立一个类别,然后看看Golang 怎么解决这个问题 。
虽然Golang没有类别,但是「建构体(Struct)」就十分地堪用了 , 首先你要知道在Golang中「类别」的成员还有方法都是在「类别」外面所定义的,这跟PHP在类别内定义的方式有所不同,在Golang中还有一点,那就是他们没有 public 、 private 、 protected 的种类 。

推荐阅读