php需要转go语言吗 php有必要转java吗( 四 )


「 蛤???杀?。浚浚?」你可能如此地说道 。是的,main.go 中除了引用 fmt 套件( 为了要输出结果用的套件 )之外完全没有引用到 a.go。
「 蛤???杀?。浚浚浚浚浚?」你仿佛回到了几秒钟前的自己 。
既然没有引用其他档案 , 为什么 main.go 可以输出 foo 呢?注意到了吗,两者都是属于 main 套件 ,因此 他们共享同一个区域 ,所以接下来要介绍的是什么叫做「套件」 。
套件是每一个 .go 档案都必须声明在Golang原始码中最开端的东西 , 像下面这样:
这意味着目前的档案是属于 main 套件( 你也可以依照你的喜好命名 ),那么要如何让同个套件之间的函式沟通呢?
接着是Golang;注意!你不需要引用任何档案,因为下列两个档案同属一个套件 。
一个由「套件」所掌握的世界,比起PHP的 include() 和 require() 还要好太多了 , 对吗?
在Golang 中没有引用单独档案的方式,你必须汇入一整个套件,而且你要记?。骸敢欢慊闳肓耍憔鸵欢ㄒ褂盟? ,像下面这样 。
假如你不希望使用你汇入的套件,你只是为了要触发那个套件的 main() 函式而引用的话?? , 那么你可以在前面加上一个底线( _ ) 。
如果你的套件出现了名称冲突,你可以在套件来源前面给他一个新的名称 。
现在你知道可以汇入套件了,那么什么是「汇出」?同个套件内的函式还有共享变数确实可以直接用,但那 并不表示可以给其他套件使用,其方法取决于 函式/变数的「开头大小写」。
是的 。Golang依照一个函式/变数的开头大小写决定这个东西是否可供「汇出」。
这用在区别函式的时候格外有用,因为小写开头的任何事物都是不供汇出的,反之,大写开头的任何事物都是用来汇出供其他套件使用的 。
一开始可能会觉得这是什么奇异的规定,但写久之后,你就能发现比起JavaScript和Python以「底线为开头的命名方式」还要来得更好;比起成天宣告 public 、 private 、 protected 还要来得更快 。
在Golang 中没有类别,但有所谓的「建构体(Struct)」和「接口(Interface)」 , 这就能够满足几乎所有的需求了 , 这也是为什么我认为Golang 很简洁却又很强大的原因 。
让我们先用PHP 建立一个类别,然后看看Golang 怎么解决这个问题 。
虽然Golang没有类别,但是「建构体(Struct)」就十分地堪用了,首先你要知道在Golang中「类别」的成员还有方法都是在「类别」外面所定义的,这跟PHP在类别内定义的方式有所不同,在Golang中还有一点,那就是他们没有 public 、 private 、 protected 的种类 。
在PHP中,当有一个类别被 new 的时候会自动执行该类别内的建构子( __construct() ),通常你会用这个来初始化一些类别内部的值 。
但是在Golang 里因为没有类别,也就没有建构子,不巧的是建构体本身也不带有建构子的特性,这个时候你只能自己在外部建立一个建构用函式 。
让我们假设你有两个类别,你会把其中一个类别传入到另一个类别里面使用,废话不多说!先上个PHP 范例(为了简短篇幅我省去了换行) 。
在Golang中你也有相同的用法,但是请记得:「 任何东西都是在「类别」外完成建构的 」 。
在PHP 中没有相关的范例,这部分会以刚才「嵌入」章节中的Golang 范例作为解说对象 。
你可以看见Golang在进行 Foo 嵌入 Bar 的时候,会自动将 Foo 的成员暴露在 Bar 底下,那么假设「双方之间有相同的成员名称」呢?
这个时候被嵌入的成员就会被「遮蔽」,下面是个实际范例,还有你如何解决遮蔽问题:

推荐阅读