【Go命令教程】7. go run
Go 源码文件包括:命令源码文件、库源码文件 和 测试源码文件。其中,命令源码文件 总应该属于 main 代码包,且在其中有无参数声明、无结果声明的 main 函数。单个命令源码文件可以被单独编译,也可以被单独安装(可能需要设置环境变量 GOBIN)。当然,命令源码文件也可以被单独运行。我们想要运行 命令源码文件 就需要使用命令 go run。
go run 命令可以编译并运行命令源码文件。由于它其中包含了编译动作,因此它也可以接受所有可用于 go build 命令的标记。除了标记之外,go run 命令只接受 Go 源码文件作为参数,而不接受代码包。与 go build 命令和 go install 命令一样,go run 命令也不允许多个 命令源码文件作为参数,即使它们在同一个代码包中也是如此。而原因也是一致的,多个命令源码文件会都有 main 函数声明。
如果 命令源码文件 可以接受参数,那么在使用 go run 命令运行它的时候就可以把它的参数放在它的文件名后面,像这样:
hc@ubt:~/golang/goc2p/src/helper/ds$ go run showds.go -p ~/golang/goc2p
在上面的示例中,我们使用 go run 命令运行命令源码文件 showds.go。这个命令源码文件可以接受一个名称为“p”的参数。我们用“-p”这种形式表示“p”是一个参数名而不是参数值。它与源码文件名之间需要用空格隔开。参数值会放在参数名的后面,两者成对出现。它们之间也要用空格隔开。如果有第二个参数,那么第二个参数的参数名与第一个参数的参数值之间也要有一个空格。以此类推。
go run 命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于 main 包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么 go run 命令就只会打印错误提示信息并退出,而不会继续执行。
在通过参数检查后,go run 命令会将编译参数中的 命令源码文件,并把编译后的可执行文件存放到 临时工作目录 中。
编译和运行过程
为了更直观的体现出 go run 命令中的操作步骤,我们在执行命令时加入标记 -n,用于打印相关命令而不实际执行。现在让我们来模拟运行 goc2p 项目中的代码包 helper/ds 的命令源码文件 showds.go。示例如下:
hc@ubt:~/golang/goc2p/src/helper/ds$ go run -n showds.go #
# command-line-arguments
# mkdir -p $WORK/command-line-arguments/_obj/
mkdir -p $WORK/command-line-arguments/_obj/exe/
cd /home/hc/golang/goc2p/src/helper/ds
/usr/local/go1.5/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -p main -complete -buildid df49387da030ad0d3bebef3f046d4013f8cb08d3 -D _/home/hc/golang/goc2p/src/helper/ds -I $WORK -pack ./showds.go
cd .
/usr/local/go1.5/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/showds -L $WORK -w -extld=clang -buildmode=exe -buildid=df49387da030ad0d3bebef3f046d4013f8cb08d3 $WORK/command-line-arguments.a
$WORK/command-line-arguments/_obj/exe/showds
在上面的示例中并没有显示针对命令源码文件 showds.go 的依赖包进行编译和运行的相关打印信息。这是因为该源码文件的所有依赖包已经在之前被编译过了。
现在,我们来逐行解释这些被打印出来的信息。
以前缀“#”开始的是注释信息。我们看到信息中有三行注释信息,并在中间行出现了内容“command-line-arguments”。我们在讲 go build 命令的时候说过,编译命令在分析参数的时候如果发现第一个参数是Go 源码文件而不是代码包时,会在内部生成一个名为“command-line-arguments”的虚拟代码包。所以这里的注释信息就是要告诉我们下面的几行信息是关于虚拟代码包“command-line-arguments”的。
打印信息中的“$WORK”表示临时工作目录的绝对路径。为了存放对虚拟代码包“command-line-arguments”的编译结果,命令在临时工作目录中创建了名为 command-line-arguments 的子目录,并在其下又创建了 _obj 子目录和 _obj/exe 子目录。
然后,命令程序使用 Go 语言工具目录 compile 命令对命令源码文件 showds.go 进行了编译,并把结果文件存放到了 $WORK 目录下,名为 command-line-arguments.a。其中,compile 是 Go 语言自带的编程工具。
在编译成功之后,命令程序使用链接命令 link 生成最终的可执行文件,并将其存于 $WORK/command-line-arguments/_obj/exe/ 目录中。打印信息中的最后一行表示,命令运行了生成的可执行文件。
通过对这些打印出来的命令的解读,我们了解了临时工作目录的用途以和内容。
在上面的示例中,我们只是让 go run 命令打印出运行命令源码文件 showds.go 过程中需要执行的命令,而没有真正运行它。如果我们想真正运行命令源码文件 showds.go 并且想知道临时工作目录的位置,就需要去掉标记 -n 并且加上标记 -work。当然,如果依然想看到过程中执行的命令,可以加上标记 -x。如果读者已经看过之前我们对 go build 命令的介绍,就应该知道标记 -x 与标记 -n 一样会打印出过程执行的命令,但不同的这些命令会被真正的执行。调整这些标记之后的命令就像这样:
hc@ubt:~/golang/goc2p/src/helper/ds$ go run -x -work showds.go
当命令真正执行后,临时工作目录中就会出现实实在在的内容了,像这样:
/tmp/go-build604555989:
command-line-arguments/
_obj/
exe/
showds
command-line-arguments.a
由于上述命令中包含了 -work 标记,所以我们可以从其输出中找到实际的工作目录(这里是 /tmp/go-build604555989)。有意思的是,我们恰恰可以通过运行命令源码文件 showds.go 来查看这个临时工作目录的目录树:
hc@ubt:~/golang/goc2p/src/helper/ds$ go run showds.go -p /tmp/go-build604555989
读者可以自己试一试。
我们在前面介绍过,命令源码文件如果可以接受参数,则可以在执行 go run 命令运行这个命令源码文件时把 参数名 和 参数值 成对的追加在后面。实际上,如果在命令后追加参数,那么在最后执行生成的可执行文件的时候也会追加一致的参数。例如,如果这样执行命令:
hc@ubt:~/golang/goc2p/src/helper/ds$ go run -n showds.go -p ~/golang/goc2p
那么带 -x 或 -n 标记的 命令程序 打印的最后一个命令就是:
$WORK/command-line-arguments/_obj/exe/showds -p /home/hc/golang/goc2p
可见,go run 命令会把追加到命令源码文件后面的参数原封不动的传给对应的可执行文件。
以上简要展示了一个命令源码文件从编译到运行的全过程。请记住,go run 命令包含了两个动作:编译 命令源码文件 和 运行 对应的可执行文件。
摘自:
http://wiki.jikexueyuan.com/project/go-command-tutorial/0.6.html
【Go命令教程】7. go run的更多相关文章
- Android ADB命令教程二——ADB命令详解
Android ADB命令教程二——ADB命令详解 转载▼ 原文链接:http://www.tbk.ren/article/249.html 我们使用 adb -h 来看看,adb命令里面 ...
- 【Go命令教程】命令汇总
[Go命令教程]1. 标准命令详解 [Go命令教程]2. go build [Go命令教程]3. go install [Go命令教程]4. go get [Go命令教程]5. go clean [G ...
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- 痞子衡嵌入式:第一本Git命令教程(0)- 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家讲的是Git命令汇编,共12篇文章,循序渐进地介绍Git操作的完整过程. 在开始Git课程之前,需要先跟大家普及2个重要概念(四度空间.四种状 ...
- Docker命令详解(run篇)
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Usage: Run a command in a new container 中文意思为:通过r ...
- 天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
问题重述: 当我们使用天河机进行并行程序实验的时候,都会使用到yhrun/srun命令.在超算环境下,yhrun 命令用来进行提交交互式作业,有屏幕输出.但是容易受到网络波动影响导致断网或者关闭窗口最 ...
- Windows 批处理(cmd/bat)常用命令教程
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 解决方法在文章末尾! ...
- Docker 命令详解(run篇)
参考:https://www.cnblogs.com/yfalcon/p/9044246.html 命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] ...
- MySQL使用教程收集(语法教程/命令教程)
说明:现在市面上的教程除了基本语法外,都基本是五花八门的,最权威且最全面的解释应该上官网去查看. https://www.tutorialspoint.com/mysql/index.htm http ...
随机推荐
- 第7月第18天 xcode bundle ffmpeg
1. https://zhuanlan.zhihu.com/p/24281404 2. 186 ffmpeg -i /Users/temp/Downloads/n-201402201522融资融券专 ...
- HDU 1005 Number Sequence (模拟)
题目链接 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f( ...
- Maven私服安装及配置——(十二)
0.私服实际是B/S架构的,需要通过浏览器访问.访问地址在 nexus-2.12.0-01\conf\nexus.properties中查看.
- nginx 日志切割(也适用于docker)
=============================================== 2019/4/6_第2次修改 ccb_warlock 201 ...
- 报错stale element reference: element is not attached to the page document结局方案
今天在调试脚本时,遇到如下报错: org.openqa.selenium.StaleElementReferenceException: stale element reference: elemen ...
- [原创]Sql2008 使用TVP批量插入数据
TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...
- 转:vue-router 2.0 常用基础知识点之router.push()
转载地址:http://www.jianshu.com/p/ee7ff3d1d93d router.push(location) 除了使用 <router-link> 创建 a 标签来定义 ...
- 【linux】sed -e 's/-//g'
sed是用来处理文本的 s/正则表达式/替换字符串/ :表示将正则表达式的内容替换为后面的字符串 g :表示替换全部,即如果不加g,则只会替换第一个 -e :多点编辑(这个没懂) 例 ...
- leetcode 题集
775. Global and Local Inversions 统计相邻元素组成的逆序对(local inversion)和全局逆序对的数量(global inversion) 思路:local i ...
- 2.选择元素 - 自定义过滤器《jquery实战》
2.5.6 自定义过滤器 jQuery 中有两种方法创建自定义的过滤器.第一种比较简单,但是不鼓励,从 jQuery 1.8 开始已经被第二种方法取代.记住,使用新方法时,你自定义的过滤器在 jQue ...