这就是我为什么从 PHP 转向 Go 的原因

2020-04-01 22:22:32 +08:00
 wangbenjun5

记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 PHP 里面 count 的用法连续问了我很多情况下的结果:

count(0);
count('00000');
count("0")
count(1)
count(null)
count("null")
count($undefinedVariable)
...

平时一般只会用 count 去计算数组或集合的元素个数,没想到还有这么多种情况,就一下子被问到了,只怪自己基础不扎实,没把 PHP 的手册背下来。。。

很多 PHP 的内置函数令人非常头疼,很多函数有很多功能、可以接受各种参数,返回的结果更无章可循,相比之下,go 的内置函数就非常简单明了,其参数类型固定,基本上一个函数只干一件事。

在写 PHP 的时候,每次调用别人写好的函数都非常不放心,因为你根本不知道这个函数返回的结果是什么东西,它可能是数组、可能是字符串、也可能是个数字。。。即使函数有注释也不一定可信,这其中有部分原因是因为开发人员水平较差,但是 go 的类型限定保证了一个函数只会返回一个固定类型的结果。

写 PHP 的时间越久你就会发现 PHP 的弱类型带来的好处远远大于坏处,项目写到最后几乎无法维护!而且里面会出现各种各样的奇怪 bug 。虽然说良好的编程习惯和规范可以避免部分情况,但是很多时候你没法通过这点保证。

使用 PHP,一个接口写完,很多时候心里压根没底,但是用 GO,写完只要编译没报错,基本上都没问题。

17337 次点击
所在节点    程序员
155 条回复
qq1340691923
2020-04-02 10:03:36 +08:00
@tt67wq 什么原因
jswh
2020-04-02 10:04:17 +08:00
所以你怎么不选 Rust ?那个才是编译不报错,连 bug 都几乎没有啊。
说到底,还是钱。如果 PHP 给钱多工作好找,还会转 go 么?
zjsxwc
2020-04-02 10:04:23 +08:00
@sagaxu

go 的 channel csp 编程模式对于处理高并发心智负担更小,比用多线程各种锁处理同步编程的要求低,水平不高的开发者也能快速出活且稳定可靠。

至于 GC,都用 GC 了,GC 性能在可以接受范围内都一样,要实时低延时,当然是直接用无 GC 的 rust 和 c/cpp 去, ~~“我都穷的吃泡面了,你跟我来谈健康? ”。

没有泛型的问题就导致了,go 写业务没有 java 快,当然更不能和 php 比写业务的效率了,所以目前我的看法 go 在业务搬砖领域还是不推荐,挺适合写基础设施的。
tt67wq
2020-04-02 10:12:05 +08:00
@qq1340691923 #61 接了百度的二手外包,已经是用 php 写的烂尾项目了,烂尾+ php, 我简直要原地升天
keepeye
2020-04-02 10:12:54 +08:00
面试官估计也就不超过 3 年经验吧,会问这种问题不奇怪
jy28520
2020-04-02 10:13:41 +08:00
coun 是查询数组的长度或是实现了 Countable 接口的对象的
如果不是这两个会转换成这个实现接口的
如果转换的过程中会相当于装箱成一个数组 null 是个特殊的对象
其他的都会转换成 array(原始值)
zjttfs
2020-04-02 10:13:51 +08:00
php , go ,py ,rust 依然主力 PHP...
dapang1221
2020-04-02 10:17:14 +08:00
业务代码里你去 count 一个 undefinedVariable 就离谱,这破题还不如手写反转红黑树
Tomorrowxxy
2020-04-02 10:17:30 +08:00
@fenglangjuxu #59 7.2 以后就只能 count 数组或对象了
way2create
2020-04-02 10:20:14 +08:00
觉得面试问这种问题很弱智
chizuo
2020-04-02 10:21:40 +08:00
@crella python 那个叫 tyoe hint,咋就变成强类型了?
also24
2020-04-02 10:21:49 +08:00
@Godikov 哈哈哈哈我就想看谁先说这个
bravist
2020-04-02 10:26:18 +08:00
动态类型与静态类型语言有一定的区别,主要看应用场景,解决问题的复杂度,时间成本等等

用了多年的 PHP 开发,必须要掌握一门动态语言,对比之后你才发现各自的优劣(这是从语言设计的本身角度讲)
davidyanxw
2020-04-02 10:26:43 +08:00
1.面试题目技术含量不高,照实说我觉得不算错
2.弱类型语言都有类似的问题,再加上不习惯写单元测试。
大项目就不太可控,如果单元测试覆盖的全,很大程度上会改善项目质量
MengiNo
2020-04-02 10:33:22 +08:00
@dapang1221 很正常 因为 PHP 怎么写都不会报错最多给 0 值的特性,我都不知道多少次在祖传代码里发现 整段函数里一次都没出现的变量,好好的被 count 、explode 、foreach 甚至 array_merge 一下了。显然是不知道经了多少手,其中一手的人改了什么东西,把这个变量删了。而 PHP 这种情况下 一不会 fatal, 二会自动取 0 值,所以大概率最终计算结果是对的,所以改的人没注意,后续维护的人没发现或者干脆也不想碰,就这样留下来了。
虽然我个人认为这是 PHP 一个非常不好的一点,导致 PHP 真的是乱写都可以跑。虽然 count($undefinedVar)没人会故意想这么写。但话又说回来,万一维护到后期出现奇奇怪怪的情况的话,如果你比较熟练的知道可能是因为某些莫名其妙的写法造成的话,就能对排错节约大量时间。考官这样问应该不是考基础的什么 countable 之类,反而像是考进阶(非得圆的话 2333 )
qce7
2020-04-02 10:46:26 +08:00
count() 一个字符串我在支付宝的 PHP SDK 代码中见过,这种神仙用法不想吐槽了
killerv
2020-04-02 11:16:30 +08:00
我使用 PHP 和 Go,但是我感觉这个题目没什么意义,我想不到 count 非 Countable 的使用场景,当然你可以说返回值不一定是预期类型,但是 PHP7.2 之后 count 字符串之类的会报错。
PHP 的优点也是缺点,很多人都是初识 PHP 的时候会觉得这玩意上手真快,后期维护的时候发现了这种快带来的问题,然后又开始抨击。还是应该客观看待吧,PHP 有他的使用场景,而且项目的健壮性和使用者水平有很大关系。
whoami9894
2020-04-02 11:49:52 +08:00
直接怼回去啊,对面试官说:问这种问题,你的水平可想而知
crella
2020-04-02 11:56:24 +08:00
@chizuo 我是看 https://blog.csdn.net/sgs595595/article/details/83986580 里的编程语言分类图的。
CSM
2020-04-02 12:01:33 +08:00
吐槽一下标题。

从 PHP 转向 Go 的原因 -> PHP 是弱类型

为什么从 PHP 转向 Go 的原因 -> 为什么(从 PHP 转向 Go 的原因) -> 为什么 PHP 是弱类型

可见“为什么……的原因”是个二级的原因。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX