1.2 工作区与 GOPATH
peter 171 3

上一节,我们了解了 Go 语言的历史。本节我们将首先学习安装 Go 开发环境,并且输出第一行代码『Hello World!』,同时我们将学习 Go 语言代码组织形式,以及 Go 的一些编译命令等。那么让我们一起开始 Go 语言的实战之旅吧!

一、Hello Go!

安装 Go 环境

  1. 从 Go 语言官方下载页面,根据用户操作系统类型下载并安装对应的 Go 语言安装包。下面以笔者的 macOS 举例

    image-20210106101451955
  2. 通过命令 go version 检查是否成功安装

    出现上图所示结果表示 Go 已经顺利在计算机上完成安装,本次安装的是 go 1.15.6 版本。

    关于 Windows 的安装可以参考官方文档

选择开发工具

Go 官网提供了 playground 可以在线运行简易的 Go 代码。同时官网提供了一系列 Go 代码示例,可以参考学习。

市面上可以用于 Go 开发的工具有很多,例如 vscode、atom、Goland 等,其中 vscode 与 atom 都是免费开源的工具,扩展性强,功能丰富。Goland 是 JetBrains 推出的专门用于 Go 语言的开发工具,笔者选择使用 Goland 作为 Go 的开发工具,因为其简单易用,便于开发大型项目。

安装 Goland 之后,就可以开始我们的第一个 Go 程序了。

老规矩,使用 Go 输出"Hello World!"

package main
import "fmt"

func main() {
    fmt.Println("Hello World!")
}

输出结果:

提示: 如果输出了 GO_PATH 等一连串的配置信息,可以参考链接,进行折叠。

二、Go 语言源码的组织方式

到这里,细心的小伙伴可能会注意到,在运行"Hello World!"程序输出的一大串信息的 GO_PATH 到底是啥,有什么意义吗?在实际进行开发之前,我们还需要知道 Go 语言源码的组织方式、了解源码安装之后的结果以及构建 Go 程序的过程。

GOPATH

你可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。 Go 语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着 GOPATH 和工作区进行的。

我们需要利用这些工作区,去放置 Go 语言的源码文件(source file),以及安装(install)后的归档文件(archive file,也就是以“.a”为扩展名的文件,这些文件也被称之为程序编译后的静态库文件)和可执行文件(executable file)。

Go 语言源码的组织方式

在实际使用程序实体之前,我们必须先导入其所在的代码包。具体的方式就是 import 该代码包的导入路径。就像这样:

import "github.com/labstack/echo"

Go 语言的源码是以代码包为基本组织单位的。在文件系统中,这些代码包与目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。

一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。

代码包的名称一般会与源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。

每个代码包都会有导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。

在工作区中,一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径。

所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。

了解源码安装后的结果

通常源码文件被放置在工作区的 src 子目录中,如果安装后产生了归档文件,就会放在工作区的 pkg 子目录下,如果产生了可执行文件,就可能会被放在该工作区的 bin 子目录。

摘自geekbang的GOPATH与工作区图

图1. GOPATH与工作区图

构建和安装 Go 程序的过程

构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且,这些操作生成的任何文件都会先被保存到某个临时的目录中。

如果构建的是库源码文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。如果构建的是命令源码文件,那么操作的结果文件会被搬运到源码文件所在的目录中。

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。

进一步说,如果安装的是库源码文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中。

三、go 命令

go build

go build 命令用于编译目标代码,在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。

go build -a 目标代码,以及其所依赖的代码包都会被编译。

go build -i 不但要编译依赖的代码包,还要安装它们的归档文件。

go build -x 可以看到go build命令具体都执行了哪些操作。

go build -n 可以只查看具体操作而不执行它们。

go build -v 可以看到go build命令编译的代码包的名称。它在与-a标记搭配使用时很有用。

go get

命令go get会自动从一些主流公用代码仓库(比如 GitHub)下载目标代码包,并把它们安装到环境变量GOPATH包含的第 1 工作区的相应目录中。如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录。

最常用的几个标记有下面几种。

  • -u:下载并安装代码包,不论工作区中是否已存在它们。
  • -d:只下载代码包,不安装代码包。
  • -fix:在下载代码包后先运行一个用于根据当前 Go 语言版本修正代码的工具,然后再安装代码包。
  • -t:同时下载测试所需的代码包。
  • -insecure:允许通过非安全的网络协议下载和安装代码包。HTTP 就是这样的协议。
预览图
评论区

索引目录