Go语言是编译型语言
Go语言是编译型语言。所谓编译型语言,编译之后生成的是本地机器指令。
Go语言是静态编译的。
注:动态编译
是否嵌入外部代码是区分静态/动态编译的标准。将外部代码嵌入到当前生成的可执行文件中的就是静态编译,以跳转的方式引用外部代码的就是动态编译。
最常见的就C/C++,一般外部开发者会将自己的代码编译成.so库(动态链接库)或者.o库(静态链接库)提供给别的开发者使用。动态编译生成的可执行文件在调用动态库代码时实际上是做了一个跳转,从当前调用处跳转到动态链接库执行然后返回调用结果。这样做的好处是:可以保护源代码的实现细节;可以减小可执行文件的体积。不好的地方是:动态链接库由于是机器代码,往往兼容性不强;生成的可执行文件依赖于动态链接库而不可独立运行,动态链接库如果丢失可执行文件也将不可执行。
C/C++里面使用静态链接库生成可执行文件实际上就是静态编译的方式。在生成可行文件时,如果需要调用静态链接库则将被调用部分(不是整个静态库)嵌入到可执行文件中(而不是像动态链接库一样做跳转)。这样生成的可执行文件可独立执行(不依赖静态库),但是显而易见可执行文件的体积就增大了,并且如果库升级了必须重新编译可执行文件。
Go里面的Package
与Java里面的作用是一样的,但是需要注意一个特殊的package——package main。
其他package定义的是一个lib,而package定义的是一个可独立运行的程序。package main中会定义main函数,main函数是整个程序的唯一入口,main函数所作的事情就是整个程序所做全部事情。
Go里面的import
跟java里面的import作用相同,但是功能更强大。它不仅可以import本地代码库,还可以借助git或者hg之类的工具import远程代码库。
不过import在使用时要注意:需要引用而没有import时当然不会通过编译,import不需要引用的lib时也通不过编译。import必须放在package之后!
Go里面的语句
Go语言不需要分号作为语句结尾,每行至少是一句语句(也有可能是多句),即语句不能跨行。
有些很奇怪的规定必须遵守,例如:
函数定义和大括号必须在用一行,例如func(){,不能将{另起一行来写。
Go里面的注释
和C/C++/Java
Go里面的字符串
和C++/Java类似,支持+/+=操作。
示例程序
/* Go支持C/C++风格的注释 */ package main import ( "os" "fmt" ) func main() { //“i := 1”是为定义变量i并赋初值,是“var i = 0”的简写 var test_0 int = 0 fmt.Println(test_0) var test_1 = 0 fmt.Println(test_1) var test_2 int fmt.Println(test_2) test_3 := 0 fmt.Println(test_3) //这里声明了两个变量,var关键字用于声明此行是“声明变量”。两个变量s和sep都是string类型。如果没有显式赋初值,变量则会被赋“默认零值” var s, sep string //os.Args代表的是程序输入参数,它是一个字符串的slice型,slice型可以看成一个简单的动态数组。常用的slice操作有:下标访问(os.Args[i]);取子集(os.Args[i:j]);求长度(len(os.Args))等 for i := 1; i < len(os.Args); i++ { //字符串运算赋值规则与其他语言类似 s += sep + os.Args[i] sep = "-->"; } fmt.Println(s) }
输出
0
0
0
0
-a-->fuck-->-b-->you