本节重点:
- 跑起第一个go程序
- 了解go的编译过程
本教程适用于 Go 版本 1.18 或更高版本。
创建一个 Go 模块
本节我们将要创建一个简单的程序,然后学习如何编译和运行它。
- 让我们创建一个目录,我们要在其中编写我们的 hello world 程序。打开终端并运行以下命令。
mkdir ~/Documents/learngo/
learngo上面的命令将在当前用户的 Documents 目录中创建一个名为learngo
的目录。这里可以随意在您希望代码驻留的任何位置创建目录。
- 创建一个 Go 模块
Go 模块用于跟踪我们应用程序的依赖项及其版本。下一步是创建一个在文件夹中命名的 go learngo模块~/Documents/learngo/
。
在~/Documents/learngo/
目录中运行go mod init learngo
。这将创建一个名为go.mod. 该文件的内容如下所示。
module learngo
go 1.18
第一行 module learngo
指定模块名称。`go 1.18 表示此模块中的文件使用 go 版本 1.18
当我们了解包时,我们将更详细地讨论 Go 模块。
Hello world
-在learngo
目录中新建 main.go
文件,内容如下:
package main
func main() {
println("Hello world")
}
保存文件名为hello.go
。
接下来,打开一个 shell 或者终端提示符,进入到文件保存的目录内。
最后,通过敲入以下命令来运行程序:
go run hello.go
如果一切正常,你将看到屏幕输出:
Hello world
运行解析
go run
命令已包含了编译和运行。它会先在一个临时目录编译程序,然后执行完后清理掉。我们可以在run
后面加--work
参数来查看临时目录。
go run --work hello.go
#会打印出如下信息:
#WORK=/var/folders/kh/ldpdqcr549x9ff5vt56wq4h40000gn/T/go-build446426376
如果要明确编译代码的话,可以通过go build
命令
go build hello.go
使用go build
后,会在目录下生成一个名为hello
的可执行文件。可通过./hello
直接执行。
交叉编译
在日常工作中,线上机器一般是linux。开发机有可能是Windows,MacOs。这时我们build
的代码在线上机可能就没办法运行了。go支持交叉编译, 在一个平台上生成然后再另外一个平台去执行。具体命令如下:
# 要去linux下执行
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
# 要去Mac下执行
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# 要去win下执行
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
参数说明
- CGO_ENABLED : CGO 表示golang中的工具,CGO_ENABLED 表示CGO禁用,交叉编译中不能使用CGO的
- GOOS: 目标平台
- mac 对应 darwin
- linux 对应 linux
- windows 对应 windows
- GOARCH:目标平台的体系架构【386,amd64, arm】, 目前市面上的个人电脑一般都是amd64架构的
- 386 也称 x86 对应 32位操作系统
- amd64 也称 x64 对应 64位操作系统
- arm 这种架构一般用于嵌入式开发。 比如 Android , IOS , Win mobile , TIZEN 等
Hello world程序的简要说明
这是我们刚刚编写的hello world程序
package main
func main() {
fmt.Println("Hello world")
}
我们将简要讨论程序的每一行的作用。在接下来的教程中,我们将深入探讨程序的每个部分。
package main
- 每个 go 文件都必须以package name语句开头。包用于提供代码划分和可重用性。此处使用包名 main。主要功能应始终驻留在主包中。
import "fmt"
- import 语句用于导入其他包。在我们的例子中,fmt包被导入,它将在 main 函数中用于将文本打印到标准输出。
func main()
-func关键字标记函数的开始。这main是一个特殊的功能。程序执行从main函数开始。{}大括号表示主函数的开始和结束。
fmt.Println("Hello World")
- 该包的Println功能fmt用于将文本写入标准输出。package.Function()是调用包中函数的语法。