Go语言实践[回顾]教程03--Go语言的编译与运行的命令行
Go语言是编译型静态语言
与常见的PHP、Python、JavaScript等动态语言不同,Go语言的源代码与C语言一样,是需要编译后才能执行的。所以,编译的过程是我们开发者必须理解的。即使将来使用集成IDE,只是鼠标点击一下就可以完成,也要明白其实IDE也是在底层调用了相关的命令而已。理解相关命令,可以在脱离IDE情况下编译和和运行源代码,更能理解Go语言的编译机理,真正理解Go语言的优势特点,以及为优化打下必要的基础。
下面是一段示例代码,具体内容我们暂时不需要深入了解,先只需要知道这段代码被执行后会在控制台输出一段字符串“I like Go!”。
// 声明 main 包
package main
// 导入 fmt 包,打印字符串是需要用到
import (
"fmt"
)
// 声明 main 主函数
func main() {
// 控制台打印 I like Go!
fmt.Println("I like Go!")
}
将上面这段代码以 main.go 文件名保存到电脑上,最好建一个文件夹,为了演示方便,我把这个文件保存在 D:\ProjectCode\Go\test1\main.go,注意:Go语言的源文件必须以 go 做扩展名。
如何编译Go语言的源文件
要执行编译命令,首先需要启动“命令窗口”或“Powershell 窗口”,打开它们有如下方法:
◆ 开始菜单 → Windows系统 → 命令提示符
◆ WIN + R 快捷键 → 输入cmd → 回车
◆ 开始菜单 → Windows PowerShell → Windows PowerShell
◆ 在源文件目录空白处按住SHIFT键鼠标右键 → 在此处打开命令窗口(W)
◆ 在源文件目录空白处按住SHIFT键鼠标右键 → 在此处打开 PowerShell 窗口(S)
后两个方式打开的命令行窗口,工作目录直接就是源文件所在的目录,编译时的源文件路径就不需要完整的绝对路径了,其他方式需要使用 cd 命令进入源文件目录才可以使用相对路径,或直接使用完整的绝对路径(绝对路径较长)。
这里我使用了最后一个方式,参看下图:
在源文件旁边的空白处鼠标右键后,在弹出菜单中点击“在此处打开 PowerShell 窗口(S)”,即可看到下图所示的命令行窗口(也叫超级终端),已经直接进入到源文件所在的目录了:
然后输入 go build .\main.go 后回车,见下图:
这样就对当前目录下的 main.go 源文件进行了编译,会生成编译后的可在当前系统运行的可执行文件,我们再看文件夹里面:
我们看到在与源文件旁边多出来一个 main 文件,实际这个文件的全名应该是 main.exe,因 Windows 系统默认会隐藏本系统可执行文件的扩展名 “.exe”,所以没有看到扩展名部分。如果想看到 .exe 扩展名,该如何让它显示出来呢,请看下图:
点击顶部主菜单中的“查看”选项后,在弹出的小界面中用鼠标勾选“文件扩展名”,然后就可以看到所有文件的扩展名了,如下图:
这个 main.exe 文件就是编译后的 Windows 系统可执行文件,将它放到其他任何一台 Windows系统的电脑或服务器上(版本差异影响除外),都是可以运行的,不需要再依赖其他运行环境。
下面解释一下上面输入的编译语句:go build .\main.go
go build,是Go语言的编译命令,表示要执行编译操作,命令后面要指定需要编译的文件,如果是要编译多个文件,中间需要用英文逗号隔开,例如 “go build .\main.go,.\a.go,.\b.go”。如果是编译当前目录下的所有源文件,也可以 “go build *.go”,这样更简单。
.\,相对路径标记符,表示当前目录下,如果是当前目录,可以省略,但最好还是不要省略,更清晰严谨。
main.go,待编译的文件名,生成的可执行文件的主名将与此文件主名相同,如果是多个文件,则与第一个文件的主名相同。
编译时也可以不带参数,只输入go build,这表示编译当前文件夹下的所有源文件,编译后的可执行文件的主名使用当前文件夹的名字。但是您可能会遇到下面的问题:
提示:go: go.mod file not found in current directory or any parent directory; see ‘go help modules’,这是因为Go语言开发包环境的模块支持没有打开,这个功能(go module)可以将项目或文件夹下源码所有的依赖,整理成一个 go.mod 文件,之后我们可不用将代码放置在src文件夹下(暂时不用深入理解,后面会又详细解释)。
那如何开启呢,我们先确认一下是不是环境有此问题,在命令行输入 go env 后回车,出现下图结果:
查看环境结果显示,GO111MODULE的值为空,这个就是启动模块支持的,我们可以在命令行上直接给 GO111MODULE 赋值,在命令行输入 go env -w GO111MODULE=auto(有off、on、auto三个值可用,后面会详解) 后回车,如下图:
然后我们再执行不带参数的编译命令,如下图:
我们再看看源文件所在的文件夹,是不是有新编译的可执行文件:
如何执行(运行)编译后的文件
在Windows系统中,鼠标双击可执行文件就可以运行,所以我们直接鼠标双击刚才生成的 main.exe 文件就可以执行。但是,我们源码中没有任何的可视化代码,只有一句 fmt.Println(“I like Go!”) 是有输出的,且这个输出只能在当前运行的命令行窗口中可以看到,所以鼠标双击没有启动命令行窗口,自然就看不到任何输出。
那需要怎样执行才可以看到呢?还是用前面启动命令行窗口,在命令行中执行就可以看到了,见下图:
就是在命令行中输入可执行文件的路径后回车就可以了。
开发中如何编译后立即执行
上面的编译命令通常在开发完成后使用,在开发阶段,我们经常需要临时运行一下,看看开发的结果,这种情况下如果按照上面的步骤,就略显麻烦。Go语言开发包提供了另一个 go run 命令,它是集编译与执行二合一的命令,并且编译后可执行文件不输出到当前文件夹下,是在系统的临时文件夹内自动管理,看似没有生成就运行一样。下面我们就演示一下这个命令:
go run 指令后面的参数定义集规则与 go build 相同,这里不在赘述。
总结
go build 命令:编译并输出可执行文件,不带参数是编译当前文件夹下的所有源文件并以文件夹命名;带参数则是源文件的绝对路径或相对路径,多个文件可以使用英文逗号分割,也可以使用 *.go 做参数编译所有源文件。常用于开发完成或阶段性测试需要获取可执行文件时。
go run 命令:临时编译并执行,不输出可执行文件,其他与 go build 相同。简化操作步骤,常用于开发中的临时查看结果。
.
.
上一节:Go/Golang语言学习实践[回顾]教程02–安装Go语言开发包