Install Golang
Golang安装参考https://golang.org/doc/install
相关环境变量
环境变量设置,将如下设置写到~/.profile文件中:
GOROOT
GOROOT是go的安装路径
package runtime中:
/src/runtime/extern.go:213
GOPATH
GOPATH是go的工作目录
package build中:
/src/go/build/build.go:204
GOBIN
GOBIN指向go安装目录中bin的位置
package main中:
/src/cmd/go/build.go:742
扩展:go env
go env可查看更多的环境变量。
GO15VENDOREXPERIMENT
package main
/src/cmd/go/pkg.go:273
编译运行
hello.go
Refer to “Go Playground” https://play.golang.org/p/F8Ev-6husG
go run是集编译,链接,运行于一体。运行完之后在当前目录下看不到任何中间文件和最终的可执行文件
go build是编译,链接。执行完之后可以在当前目录下看见可执行程序hello. 使用-work参数可以生成临时文件。
工程管理
Go工程目录树结构
Go管理Project的方法比较特别,没有工程文件,而是使用目录结构和包名来推导工程结构和构建顺序,所以Go工程的目录结构和包名就很讲究,必须符合规定。
以一个加减乘除计算器为例。
目录结构如下:
一般Go工程都会包含bin, pkg, src 3个目录。bin和pkg可以先不创建,go命令可以自动创建(比如 go install)。src
目录顾名思义,是源码文件,Go源文件以package方式组织,新建一个package,就是在src
下新建一个文件夹。
如上面tree所示,src
下有calc
和littlemath
2个文件夹,即有2个package,一个littlemath package, littlemath下的4支文件中的package名称最好和目录名称保持一致,如果不一致就会比较麻烦,容易让人产生混淆,后面会说明package名称和目录名称不一致的情形。
另一个calc
文件夹,是main package,calc.go
中有表明是main package.
构建工程
构建之前需要设置此工程的GOPATH. 每个工程都需要设置GOPATH环境变量,感觉还是有点小麻烦的。编辑~/.profile
,将littlecalc路径添加到GOPATH
中,然后source ~/.profile
.
使用go build
来构建工程
执行如下操作即可在bin
目录下看到生成的可执行文件calc.
使用-x
参数查看build中间过程。
先会创建临时目录才存放build中间结果,真正进行编译的是compile
命令,链接的是link
命令。最终build的可执行文件从临时目录中移到当前工作目录下。
执行完go build
的目录结构如下。
使用go install
来构建工程
|
|
得到的结果如下。
发现最终生成的结果想要拷贝到/usr/local/go/bin
下,因为当前时非root用户,没有权限执行此操作。奇怪的是,为什么不是往当前工作目录的bin
下拷贝呢?原来是$GOBIN
环境变量导致的。前面将$GOBIN
设置成了$GOROOT/bin
, 重新设置环境变量如下。
然后再执行go install calc
,可以看到目录树如下。在bin
下多了一个叫calc
的最终可执行文件;在pkg下多了一个package文件littlemath.a
.
go build
和go install
的区别
其实从上述-x
参数得到的结果也可以粗略看出二者的区别。go install
会创建bin
和pkg
,会将编译出所依赖的package放在pkg中,将最终的可执行文件放在bin中,这个bin的具体位置受到$GOBIN环境变量的影响。
package名称与目录名称不一致的情形
对上面小工程的目录树结构稍作改变,将littlemath
改名成mymath
.
mymath
中的源文件中package名字仍然保留littlemath.
calc/calc.go
import的package也保留littlemath.
然后go install -x calc
会提示找不到littlemath package.
但将calc/calc.go
中import的package改成mymath
,则可编译成功。
go install -x calc
以上可以发现,编译产生的静态包(package)文件是以目录名来命名的。import时应该是目录名,而在引用包时则需要包名。
虽然将littlemath
改成了mymath
,calc/calc.go
中的import "littlemath"
改成了import "mymath"
,
但是mymath
下的源文件中仍然定义的是package littlemath
,calc/calc.go
中引用包中的函数仍然是类似于little.Add()
这样的。
摆脱每新建一个工程就需要重新设置GOPATH的方法
来自于Go项目的目录结构。
与src
平行路径新建一支build.sh
文件,内容如下。
使用方法:sh build.sh [packages]
,如sh build.sh calc
.
Appendix
calc源码:
https://github.com/magicse7en/go-practice/commit/668cd75c498bfd1c8542eeefb8547c53dd2e7cde
修改包名与目录名不一致的源码:
https://github.com/magicse7en/go-practice/commit/fce999305dd0c025493a4e3282379291c8d8f69e
build.sh