wordpress建站 网盘视频教程,做网站哪便宜,公司商标设计网站,seo整站优化的思路及步骤上篇文章介绍了Golang在不同系统下的安装#xff0c;并完成了经典的Hello World案例。在这个过程中#xff0c;我们用到了go run命令#xff0c;它完成源码从编译到执行的整个过程。今天来详细介绍下这个过程。简单理解#xff0c;go run 可等价于 go build 执行。 build命…上篇文章介绍了Golang在不同系统下的安装并完成了经典的Hello World案例。在这个过程中我们用到了go run命令它完成源码从编译到执行的整个过程。今天来详细介绍下这个过程。简单理解go run 可等价于 go build 执行。 build命令简述在Golang中build过程主要由go build执行。它完成了源码的编译与可执行文件的生成。go build接收参数为.go文件或目录默认情况下编译当前目录下所有.go文件。在main包下执行会生成相应的可执行文件在非main包下它会做一些检查生成的库文件放在缓存目录下在工作目录下并无新文件生成。 新建hello案例在正式介绍编译流程前再重新演示下Hello World案例新建hello.go文件代码如下package mainimport fmtfunc main() {fmt.Println(Hello World)
}执行go build hello.go目录下生成可执行文件hello。执行hello输出Hello World。介绍build选项编译流程的演示需要go build提供的几个选项协助执行go help build查看。如下$ go help build...-n 不执行地打印流程中用到的命令
-x 执行并打印流程中用到的命令要注意下它与-n选项的区别
-work 打印编译时的临时目录路径并在结束时保留。默认情况下编译结束会删除该临时目录。...这几个选项也适用于go run命令。有没有觉得和sh命令选项类似可见计算机里的很多知识都是相通的。打印执行流程使用 -n 选项在命令不执行的情况下查看go build的执行流程如下$ go build -n hello.go
#
# command-line-arguments
#mkdir -p $WORK/b001/
cat $WORK/b001/importcfg EOF # internal
# import config
packagefile fmt/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile runtime/usr/local/go/pkg/darwin_amd64/runtime.a
EOF
cd /Users/polo/Public/Work/go/src/study/basic/hello
/usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath $WORK/b001 -p main -complete -buildid fVbBEz0nTJc3r6VxU5ye/fVbBEz0nTJc3r6VxU5ye -goversion go1.11.1 -D _/Users/polo/Public/Work/go/src/study/basic/hello -importcfg $WORK/b001/importcfg -pack -c4 ./hello.go
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internal
cat $WORK/b001/importcfg.link EOF # internal
packagefile command-line-arguments$WORK/b001/_pkg_.a...packagefile internal/race/usr/local/go/pkg/darwin_amd64/internal/race.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmodeexe -buildidP1Y_fbNXAEG6zEEGqFsM/fVbBEz0nTJc3r6VxU5ye/fVbBEz0nTJc3r6VxU5ye/P1Y_fbNXAEG6zEEGqFsM -extldclang $WORK/b001/_pkg_.a
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internal
mv $WORK/b001/exe/a.out hello过程看起来很乱仔细观看下来可以发现主要由几部分组成分别是创建临时目录mkdir -p $WORK/b001/查找依赖信息cat $WORK/b001/importcfg ... 执行源代码编译/usr/local/go/pkg/tool/darwin_amd64/compile ... 收集链接库文件cat $WORK/b001/importcfg.link ...生成可执行文件/usr/local/go/pkg/tool/darwin_amd64/link -o ...移动可执行文件mv $WORK/b001/exe/a.out hello如此一解释build 的流程就很清晰了。如果是熟悉c/c开发的朋友会发现这个过程似曾相识。当然相比之下c/c还会多出一步预处理。再来优化下之前的流程图如下我们把build过程细化成两部分compile与link即编译和链接。此处用到了两个很重要的命令complie和link。它们都是属于go tool的子命令。说说run的流程理解了build过程run就很好理解了。我们使用go run -x hello.go 查看执行过程如下...
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/hello -importcfg $WORK/b001/importcfg.link -s -w -buildmodeexe -buildidfveq2guPMmsyv8t4cV_M/xYBkVZeN1BHy2ygmstrB/pWJerx2-jOU98BpvIFO6/fveq2guPMmsyv8t4cV_M -extldclang $WORK/b001/_pkg_.a
$WORK/b001/exe/hello
Hello World重点看结尾部分与build不同的是在link生成hello文件后并没有把它移动到当前目录而是通过$WORK/b001/exe/hello执行了程序。加上编译画出如下流程图到此run的整个流程到此就很清晰了。通过--work保留可执行文件那么能否拿到这个临时生成的可执行文件默认是不行的在go run最后会把临时目录删除。我们可以使用--work保留这个目录。演示过程如下$ go run -x --work hello.go
WORK/var/folders/bw/8yw8h4yj2vb6mxtb6t8t41f00000gn/T/go-build149627400...$WORK/b001/exe/hello
Hello World打印了临时目录路径WORK通过mv命令我们就可以把run生成的hello文件拷贝到当前目录如下所示$ mv /var/folders/bw/8yw8h4yj2vb6mxtb6t8t41f00000gn/T/go-build149627400b001/exe/hello hello可以执行下hello看看和我们预期的是否一样。总结本篇文章从go run引出Golang的编译执行流程。利用build提供的几个调试选项我们实现了过程的逐步分解最终比较详细地介绍了整个编译执行流程中的各个阶段。