一般前端大手子写js写久了,要么就是去尝试其他语言,从其他语言的角度理解js收获不一样的感受,要么就是去研究js的内部实现,为啥会有this,为啥会有作用域,闭包这些耳熟能详的知识点。当然,我是个菜狗,但是也想体验一下比较js和其他语言的感觉。
我在上学的时候,被c和c++深深的折磨过,到现在还对神一样的指针有阴影,我的指针不是指向锟斤拷就是指向烫烫烫😠。但是私以为要想成长就要勇于跳出舒适圈,强类型语言的指针就是心魔,克服了就是神,被压制住永远都是魔。机缘巧合下,开始了学习go,我也希望在我的学习过程中,能够对比js的相关特性,让自己对js的理解能够加深(也许?)。
写在文章前
这篇文章是面向新手的,各位大手子可以忽略掉。如果文中有什么错误理解或者错误观点,或者各位看官老爷有什么意见或者建议欢迎在评论中提出来,一定即时更正。Thanks~
安装
js是依赖于宿主的环境,js 依赖于node环境或者浏览器环境,他是站在巨人的肩膀的上的。 go就不一样了,go作为一个成熟的语言,他独立了,所以要想运行go语言,是需要安装的。(这也许就是成长的代价吧)
安装的过程很简单,官网下载,安装。 大功告成。
远古版本的go需要配置环境变量,都1.12的船心版本了,开箱即用。
编译器goland,走一波。

虽然不需要手动配置path了,但是root还是要选好。就这样第一个go项目目录就建好了。但是没有清晰结构的项目目录都是虚假的项目。没有命名规则的代码都是虚假的代码,既然进了go的门,就遵守一下大家约定的go规范嘛。后面的文章会介绍test函数和文件的编写。
- src文件夹下面放源码
- pkg文件夹放编译文件
- 测试文件
_test结尾 - 测试函数
Test开头 - 项目的入口函数必须是main
Hello World
没有hello world 的新语言学习都是不完整的,我们通过命令行,将hello world 输出。
go中每个文件都是package,内置package 和 文件的引入都使用import关键字引入。
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello World");
}
package是必须要声明的,package名字可以不与文件名一致。因为我们使用fmt的Println进行输出,所以要引用fmt
运行go文件
go run ./main.go

可以看到Hello world就在控制台输出了,但是本着科研精神,如果我改一些需要注意的地方,程序能正确运行吗?
Hello World 的不正确的打开方式
文件名和package 不一致

如截图所见,package名字和文件名字不一样不影响运行。我们run的还是main package。

package 不是 main
我们准备run一个不是main的package ,但是他的文件名还是main.

看来即使你叫假发,村里的乡亲还是只认识桂。
function 的名字不是main
文件名和package 的关系上面已经理清了,那么,无论vivian还是张二丫,只要本质是张二丫,乡亲们就认识你。
但是如果main文件没有main函数,还能跑吗?

看来,你要是没了用途,管你假发还是桂,乡亲们照样翻脸不认人。
Main 函数有自己的骄傲
js中没有main函数必须做入口才能运行等等条条框框,所以大家写起函数来也很随意的,当然也有一些规范,但都不是语言层面的。Go不仅要求要有main函数,而且还规定了这个函数头头必须和外面的妖艳贱货不一样。
没有返回值
java中main的返回值是void,这是强制的。同样go中,main也不能有返回值。又本着科研的精神,我们在犯错的边缘试探一下。
嗯可以看到,我还没运行的时候,就各种红色飘飘。

没有传参
main函数不支持传参。官网是这么说的
The main package must have package name main and declare a function main that takes no arguments and returns no value.

编译
JS是一种解释型语言,从现象上来看就是不用编译。具体的解释可以看这篇大佬的文章,这里就不赘述了。前端中vue文件的编译其实可以理解是虚假的编译,他是为了让vue文件压缩转换成宿主环境能识别的js和html,而不是机器识别的。但是go是强类型语言,文件想被系统运行要转换成二进制文件才可以,多年不编译文件的菜鸡我,再次见到二进制的文件竟然有点小激动。
之前说大家规定,编译后的文件都放在了pkg文件夹中,我们在pkg文件目录下,运行
go build ../src/main.go
就能看到pkg文件夹下有了个可运行的二进制文件main了。

总结
写多了随意的js,在接触go的时候其实确实有点不适应。但是我觉得强类型语言能够很好的规范代码,再也不会出现用的时候才知道是什么类型的这种情况。 从hello world中,我们了解了package 和 file name 以及 main函数的命名规范,以及初识了高贵的既不付出也不接受好意的main函数。
就这样,我拥有了第一个由go生成的二进制文件,快乐。