最近项目完工,遂学习学习go,写一下学习记录,加强记忆,顺带梳理下和php的差异
1.go是编译型语言
想想 C 语言编译、链接和安装可执行程序的繁琐步骤,首先要通过 configure
脚本对特定平台进行检测,比如是否包含 GCC 等编译工具,然后生成 Makefile 文件,该文件定义了编译、链接规则,为下一步编译工作做准备,接下来就是执行 make
命令进行编译工作,最后再执行 make install
命令完成应用程序的安装,经历过这些步骤才可以实现将 C 程序源代码编译为可执行程序。
安装过php拓展的都知道,php拓展也是由c编写的,需要编译安装,也是很麻烦
从上面的构建过程中可以看到,真正的构建命令就一句:
go build calc
这就是为什么说 Go 命令行工具是非常强大的。我们不需要写 makefile
,因为这个工具会替我们分析,知道目标代码的编译结果应该是一个包还是一个可执行文件,并分析 import
语句以了解包的依赖关系,从而在编译 calc.go
之前先把依赖的 simplemath
编译打包好。Go 命令行程序制定的目录结构规则让代码管理变得非常简单。
2.go是静态语言
var v1 int //声明变量 并未赋值
纯粹的变量声明,Go 语言引入了关键字 var
,并且将类型信息放在变量名之后
PHP 是动态语言(昵称「鸭子类型」),变量在声明时没有类型之说,变量类型是在运行时动态判断的,不需要关键字 var
修饰,而是以 $
作为变量名前缀实现类似的效果,也没有这种纯粹的声明语句(类的成员变量除外)
php可以直接声明变量,而后再赋值,这是弱类型语言的好处,当然坏处是 弱类型语言的使用在某些场景下内部的类型自动转换,导致业务判断逻辑,不为预期发展,而踩到坑(此时 可以强类型比较,或强制转换类型,即对赋值后的变量定义类型)
3.go的变量初始化
v3 := 10 //省略 var,编译器可以自动推导出v3的类型
对变量同时进行声明和初始化时,指定类型已不再是必需的,Go 编译器可以从初始化表达式的右值推导出该变量应该声明为哪种类型(纯粹的变量声明时可不能省略类型,那样会编译器会报错),这让 Go 语言看起来有点像动态类型语言,但是与 PHP 等动态语言不通的是,这个推导是在编译期做的,而不是运行时,所以 Go 语言还是不折不扣的静态语言。
php中变量类型的确认是在运行期间,而go是在编译期间,(个人理解,编译这个动作包含了运行,或者说运行时的检测),所以php作为解释型语言,不需要编译,这是开发效率的提升,同时也是生产时性能的牺牲
关于变量初始化和声明:
在 PHP 中,通常变量声明和初始化是一体的,即通过初始化的方式完成变量的声明,类的成员变量除外。
在 Go 语言中,变量初始化和变量赋值是两个不同的概念,变量初始化集变量声明和赋值为一条语句,
即 v3 := 10
变量赋值则是先声明变量,再对其进行赋值,
即
var v1 int
v1 = 123
初始化只能执行一次,赋值则可以执行多次。见下
另外,出现在 :=
左侧的变量不应该是已经被声明过的,否则会导致编译错误,比如下面这个写法:
var i int
i := 2
会导致如下这种编译错误:
no new variables on left side of :=
参考链接:https://laravelacademy.org/post/19724.html