1.2 工作区与 GOPATH
peter 436 3

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

一、Hello Go!

安装 Go 环境

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

    1.2 工作区与 GOPATH
  2. 通过命令 go version 检查是否成功安装

    1.2 工作区与 GOPATH

    出现上图所示结果表示 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!")
}

输出结果:

1.2 工作区与 GOPATH

提示: 如果输出了 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 子目录。

1.2 工作区与 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 就是这样的协议。
评论区

索引目录