这两年唱衰 PHP 的论调不少(其实我觉得大可不必),导致不少 PHP 程序员产生危机感,纷纷寻求转型,根据我的观察,基本上 Go 都是首选。不管怎么说,技多不压身,多掌握一点知识总是好的。本文就作为一个基础的入门来帮助 PHP 程序员入门 Go 语言吧。

1. 脚本语言 vs 编译型语言

这其实是个我每次面试都会问的问题,脚本语言和编译型语言有什么区别。维基上的解释:语法和结构通常比较简单

学习和使用通常比较简单

通常以容易修改程序的“解释”作为运行方式,而不需要“编译”

程序的开发产能优于运行性能

从我的角度,可以从执行角度和环境依赖上来说。简单理解,作为脚本语言,你可以单独写一行 <?php echo "Hello World";,命名为任意文件,然后使用 php 解释器来执行。甚至可以使用 php -a 进入交互环境执行任何代码。go 这种编译型语言就不是这样。因为是先编译后执行,go 一定需要知道程序的入口文件和入口函数。所以一个程序的执行一定需要 main 函数(go test 文件除外)。虽然 go 也提供了 run 指令省略到编译的步骤。在环境依赖上,执行 php 的服务器一定需要预装固定版本 php 解释器,而编译成二进制文件的 go 程序则只需要在对应架构的服务器上即可运行。这本质上是 php 的解释器扮演的才是 go 编译后的程序的角色,而脚本则是在 php 解释器构建的一层虚拟机上执行的。所以脚本语言在不同平台上表现的一致性更好,而使用编译型语言则需要有更好的操作系统和网络底层知识。

2. 动态语言 vs 静态语言

动态语言与静态语言又分别被称为弱类型语言和强类型语言,其实这样描述也更加形象。PHP 会在执行的过程中做隐式类型转换(虽然也提供了类型转换的函数和关键字),go 的类型转换却需要手动、强制的来执行。弱类型语言带来了很多便利性,但是也隐含了很多问题,以至于 PHP 要引入 === 这种比较方式,不过经验丰富的 PHP 开发应该是能在每一个变量定义之前都确认好它的数据类型的。go 语言中不存在隐式转换的问题,但是写起来肯定也没有那么爽,光是 int 都有多种长度的类型,会让很多新手不太适应,同样的道理,定义每一个变量之前都稍加思考,就能轻松解决这个问题。go 提供了 := 和 var 关键字的赋值方式,编译器会根据初始化的值自动推导出相应的类型,但是这个用法同样也要求你小心处理作用域的问题,不妨猜一下下面这段代码的输出:

package main

import (

"fmt"

)

func main() {

var a int

a = 1

if a, ok := foo(); ok == true {

fmt.Println(a)

}

fmt.Println(a)

var ok bool

if a, ok = foo(); ok == true {

fmt.Println(a)

}

fmt.Println(a)

}

func foo() (int, bool) {

return 2, true

}

3. Go 还要不要 MVC

先说我的观点:不需要。其实不只是 go 开发,PHP 的微服务框架比如 Slim 默认也不是按照 MVC 的方式组织代码的。本身现在前端工程化程度越来越高,一般都拉出去单独开项目,也不需要接口项目准备 V 的部分,所以说 MVC 是时代的产物,可以被淘汰了。再者,go 使用的函数名、变量一般都比较简洁,Controller 这个长长的单词看起来真的有点突兀。go 语言本身有一些约定性的命名方式,对代码的访问、编译和执行都是有影响的,比如 internal 目录下的内容不能被外部包访问,在搭建 go 项目的时候,也应该按照这些约定来,这才符合 go 的规范。这里有一个 go 项目目录组织的 demo:https://github.com/golang-standards/project-layout, 值得参考一下。也可以看一下这篇文章,写的很不错:https://draveness.me/golang-101/。

4. Go 还要不要框架

既然 MVC 都不需要了,那开发框架还需不需要呢?这个问题没有固定答案,因为同样在 PHP 中,框架的概念也渐渐弱化,包的概念逐渐强化。只要有 Composer,徒手搭建一个 PHP 的框架不是什么难事。从 1.13 的版本之后,go 终于有了默认统一的包管理方式,虽然不算完美,但总算解决了以前管理混乱、限制太多的问题,具体的介绍可以参考官方说明:https://blog.golang.org/using-go-modules。选一个或者写一个好用的基础结构,配上一些不错的包,就可以愉快的开始项目开发了。

最后我还是想说明一下,语言本身可能有设计上的不同,但不应该有好坏之分,特别是应用比较广泛的语言,自然是因为其自身的某些特性吸引人。选择适合自己的、适合业务的就可以,不要当语言上的精神贵族。

php程序员如何转go,写给 PHP 程序员的 Go 入门教程相关推荐

  1. 简单介绍三个C语言图形库C语言其实最擅长的是写纯数据处理的程序 . 非得用C语言写个界面程序那将会变得很困难 . 我刚开始学C语言就是从hello world 开始的 , 后来慢慢开始学从三个数中找

    C语言其实最擅长的是写纯数据处理的程序 . 非得用C语言写个界面程序那将会变得很困难 . 我刚开始学C语言就是从hello world 开始的 , 后来慢慢开始学从三个数中找出最大值 , 和对数组进行 ...

  2. python手写字体程序_深度学习---手写字体识别程序分析(python)

    我想大部分程序员的第一个程序应该都是"hello world",在深度学习领域,这个"hello world"程序就是手写字体识别程序. 这次我们详细的分析下手 ...

  3. 彩票中奖java程序 随机30选7_写一个彩票程序:30选7

    1. 写一个彩票程序:30选7.随机(1~30之间)生成7个随机数,注意不能重复.然后从键盘输入7个数,对比7个数是否与随机数有相同的.最后显示"中了几个号".同时,如果中了7个号 ...

  4. c语言程序字体放大,C语言写的俄罗斯方块程序减小字体 增大字体 作者.docx

    C语言写的俄罗斯方块程序减小字体 增大字体 作者 C语言写的俄罗斯方块程序减小字体增大字体作者:佚名来源:不详发布时间:2009-9-21 1:11:22收藏到网摘:合作洽谈大概在最近两天之内编码完成 ...

  5. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

  6. 2020年末知识大总结:Java程序员转Android开发必读经验一份,嵌入式开发入门教程

    Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择.学安卓从事移动互联方向开发,学Java从事软件.网站开发.而安卓上的应用大多是Java编写 ...

  7. c语言数独出题程序,我用C语言写解数独程序(一)

    我要用C语言写一个解数独题目的程序,从我刚开始接触数独的时候,我就这样告诉自己.记得那是暑假的一天.在家闲来无事,就翻开了以前买的一本 <数独>.从看前面的例题开始,然后自己解第一个题,之 ...

  8. 一行代码都不写!Github 博客小白版入门教程

    赖可 发自 凹非寺 量子位 报道 | 公众号 QbitAI GitHub不仅可以传代码,还可以建博客.利用GitHub Pages平台,就可以搭建非常好用的个人博客. 但是难点在于,你在要敲很多代码才 ...

  9. 一行代码都不写!Github博客小白版入门教程

    赖可 发自 凹非寺 量子位 报道 | 公众号 QbitAI GitHub不仅可以传代码,还可以建博客.利用GitHub Pages平台,就可以搭建非常好用的个人博客. 但是难点在于,你在要敲很多代码才 ...

  10. 排行榜上用C++写局域网聊天程序

    摘要:用C++写局域网聊天程序 2012年07月09日啰嗦完天使之道,尽量将具有相类似功能的即时通讯软件用例抽象并归类,防属性,揭开人类进程的惊天秘密,并没有攻击技能,用C++写局域网聊天程序获得了众 ...

最新文章

  1. 让你不再害怕指针(一)
  2. 查看计算机CPU、内存使用情况
  3. 7-25 雨刷程序功能扩展设计 (100 分)
  4. 涨知识 | 100个中国最难读的地名,第一个就折了
  5. 树莓派教程 - 1.6 树莓派GPIO库wiringPi 外接USB串口ttyUSB ch340 cp2102
  6. 问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面Inverse Mapping
  7. 如何在 Apple TV 上安装 tvOS 15 developer beta 9?
  8. 好玩的C语言大全,好玩的c语言程序!
  9. 优秀工程师必备的三大思维
  10. 关于考研复习数学分析和高等代数
  11. 不是每个捕鱼都叫捕鱼达人:Cocos精品《捕鱼达人4》华丽升级
  12. python下载酷狗音乐加UI版本
  13. 【教程】PDF开发工具Spire.PDF 教程:使用C#从PDF中的特定矩形区域中提取文本
  14. SteamVR 2.x 手柄使用3D物体(14)
  15. 二级管的正向恢复与反向恢复时间
  16. 浅谈码农职场修养三五点
  17. 朗伯余弦定律(Lambert‘s Cosine Law)
  18. Unity 的用UnityEvent来自定义触发方式
  19. unix服务器备份文件命令,linux/unix系统间文件备份脚本
  20. 两款测试管理工具:TestLink 与飞蛾深度横评

热门文章

  1. 计算机考试长文档编辑,职称计算机考试:Powerpoint2003长文档1
  2. 大学计算机第四版蒋加伏ppt,大学计算机基础 普通高等教育十一五 国家级规划教材 教学课件 作者 蒋加伏 王宇 第5章 Powerpoint 2003演示文稿制作基础.ppt...
  3. 【大数据分析】Spark SQL查询:使用SQL命令
  4. java怎么销毁session_java怎么销毁session?
  5. 2022年小米产业链研究报告
  6. 如何通过Google学术快速获取参考文献引用格式-2021年
  7. 《算法导论》读书笔记(总纲)
  8. 提问的智慧(转自github)
  9. 印尼语翻译和爪哇翻译一次争斗为自定义
  10. 【win10专业版】ultraiso如何制作光盘启动盘