diff --git a/code-language/go/README.md b/code-language/go/README.md index fc6b601..4c31da3 100644 --- a/code-language/go/README.md +++ b/code-language/go/README.md @@ -112,7 +112,173 @@ ## 2. 基础 -### 2.1 +### 2.1 配好环境:选择一种最适合你的Go安装方法 + +- 选择 Go 版本 + - Go 语言的版本发布策略 + - Go 团队已经将版本发布节奏稳定在每年发布两次大版本上,一般是在二月份和八月份发布 + - 一般情况下,我建议你采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的,少有影响使用的重大 bug。 + - 使用次新版,即最新版本之前的那个版本比如,当前最新版本为 Go 1.17,那么这些项目会使用 Go 1.16 版本的最新补丁版本(Go 1.16.x),直到发布 Go 1.18 后,这些项目才会切换到 Go 1.17 的最新补丁版本(Go 1.17.x)。 + +- 安装 Go + - **在 Linux 上安装 Go** + - 需要下载并解压 Go Linux 安装包: + - $wget -c https://golang.google.cn/dl/go1.16.5.linux-amd64.tar.gz + - 虽然 Go 官方下载站点是 golang.org/dl,但我们可以用针对中国大陆的镜像站点 golang.google.cn/dl 来下载 + - 第二步,将下载完毕的 Go 安装包解压到安装目录中: + - $tar -C /usr/local -xzf go1.16.5.linux-amd64.tar.gz + - 执行完上面解压缩命令后,我们将在 /usr/local 下面看到名为 go 的目录,这个目录就是Go 的安装目录,也是 Go 官方推荐的 Go 安装目录。我们执行下面命令可以查看该安装目 + 录下的组成: + - > $ls -F /usr/local/go
+ AUTHORS CONTRIBUTORS PATENTS SECURITY.md api/ doc/ lib/
+ CONTRIBUTING.md LICENSE README.md VERSION bin/ favicon.ico misc
+ - 将 Go 二进制文件所在路径加入到用户环境变量 PATH 中,具体操作是将下面这行环境变量设置语句添加到 $HOME/.profile 文件的末尾: + - export PATH=$PATH:/usr/local/go/bin + - 然后执行下面命令使上述环境变量的设置立即生效: + - $source ~/.profile + - 最后,我们可以通过下面命令验证此次安装是否成功: + - $go version + - 如果这个命令输出了“go version go1.16.5 linux/amd64”,那么说明我们这次的 Go 安装是成功的。 + - **在 Mac 上安装 Go** + - 在 Mac 上我们可以在图形界面的引导下进行 Go 的安装。不过,我们先要下载适用于Mac 的 Go 安装包: + - $wget -c https://golang.google.cn/dl/go1.16.5.darwin-amd64.pkg + - 安装包下载完毕后,我们可以双击安装包,和 Linux 一样,Mac 上的 Go 安装包默认也会将 Go 安装到 /usr/local/go 路径下面,将这个路径加入到用户的环境变量 PATH中。具体操作方法与上面 Linux 中的步骤一样,也是将下面环境变量设置语句加入到$HOME/.profile 中,然后执行 source 命令让它生效就可以了: + - PS: 如果你安装了zsh等,就要换一下环境变量,使其生效 + - export PATH=$PATH:/usr/local/go/bin + - 通过 go version 命令验证一下这次安装是否成功。 + - **在 Windows 上安装 Go** + - 在页面上找到 go 1.16.5 版本的 Windows msi 安装包, 安装程序默认会把 Go 安装在 C:\ProgramFiles\Go 下面 + - Go 安装程序还会自动为你设置好 Go 使用所需的环境变量,包括在用户环境变量中增加 GOPATH,它的值默认为 C:\Users[用户名]\go,在系统变量中也会为 Path 变量增加一个值:C:\Program Files\Go\bin,这样我们就可以在任意路径下使用 Go 了。 + +- 安装多个 Go 版本 +- 首先,你需要按照标准步骤将 go 其他版本 安装到事先建好的 /usr/local/go.其他版本 路径 下: +- **方法一:重新设置 PATH 环境变量** + +```shell +$mkdir /usr/local/go1.15.13 +$wget -c https://golang.google.cn/dl/go1.15.13.linux-amd64.tar.gz +$tar -C /usr/local/go1.15.13 -xzf go1.15.13.linux-amd64.tar.gz +``` +- 接下来,我们来设置 PATH 环境变量,将原先 $HOME/.profile 中的 PATH 变量的值由: +```shell +export PATH=$PATH:/usr/local/go/bin +``` +- 改为 +```shell +export PATH=$PATH:/usr/local/go1.15.13/go/bin +``` +- 这样通过执行 source 命令重新使 PATH 环境变量生效后,我们再执行 go version 命令 +```shell +$go version +go version go1.15.13 linux/amd64 +``` +- Go 官方也提供了一种在系统中安装多个 Go 版本的方法,下面我们就来看一下第二种方法。 + +- **方法二:go get 命令** +- 这种方法有一个前提,那就是当前系统中已经通过标准方法安装过某个版本的 Go 了。 +- HOME/go/bin加入到P ATH环境变量中并生效,即便HOME/go/bin 这个目录当前不存在也没关系: +```shell +export PATH=$PATH:/usr/local/go/bin:~/go/bin +``` +- 然后,我们要执行下面这个命令安装 Go 1.15.13 版本的下载器: +```shell +$go get golang.org/dl/go1.15.13 +``` +- 这个命令会将名为 go1.15.13 的可执行文件安装到 $HOME/go/bin 这个目录下,它是Go 1.15.13 版本的专用下载器,下面我们再来执行 Go 1.15.13 的下载安装命令: +```shell +$go1.15.13 download +Downloaded 0.0% ( 16384 / 121120420 bytes) ... +Downloaded 1.8% ( 2129904 / 121120420 bytes) ... +Downloaded 84.9% (102792432 / 121120420 bytes) ... +Downloaded 100.0% (121120420 / 121120420 bytes) +Unpacking /root/sdk/go1.15.13/go1.15.13.linux-amd64.tar.gz ... +Success. You may now run 'go1.15.13' +``` +- 现在,我们看到这个命令下载了 go1.15.13.linux-amd64.tar.gz 安装包,也将它安装到 $HOME/sdk/go1.15.13 下面了。下载安装结束后,我们就可以利用带有版本号的 go 命 + 令来使用特定版本的 Go 了: +```shell +$go1.15.13 version +go version go1.15.13 linux/amd64 +``` +- 同样的,我们也可以通过下面这个命令查看特定 Go 版本的安装位置: +```shell +$go1.15.13 env GOROOT +/root/sdk/go1.15.13 +``` + +- 配置 Go +- Go 的配置项是以环境变量的形式存在的,我们可以通过下面这个命令查看 Go 的这些配置项: +```shell +$go env +``` +- 常用配置项: +- ![常用配置项](pic/常用配置项.png) +- 了解更多关于 Go 配置项的说明,你可以通过 go help environment 命令查看。 + +### 2.2 初窥门径:一个Go程序的结构是怎样的? +- 编写并运行第一个 Go 程序 + - 首先,我们需要创建一个名为 main.go 的源文件。 + - Go 的命名规则。Go 源文件总是用全小写字母形式的短小单词命名,并且以.go 扩展名结尾。 + - 如果要在源文件的名字中使用多个单词,我们通常直接是将多个单词连接起来作为源文件名,而不是使用其他分隔符,比如下划线。也就是说,我们通常使用 helloworld.go 作为文件名而不是 hello_world.go。 + - 这是因为下划线这种分隔符,在 Go 源文件命名中有特殊作用 + - 尽量不要用两个以上的单词组合作为文件名,否则就很难分辨了 +- main.go +```go +package main +import "fmt" +func main() { + fmt.Println("hello, world") +} +``` +- 编译和运行这个文件 - Linux +```shell +$go build main.go +$./main +hello, world +``` +- 编译和运行这个文件 - Windows +```shell +>go build main.go +>.\main.exe +hello, world +``` + +- “hello,world”示例程序的结构 +- package 定义了 Go 中的一个包 package。包是 Go 语言的基本组成单元,通常使用单个的小写单词命名,一个 Go 程序本质上就是一组包的集合。所有 Go 代码都有自己隶属的包 +- main 包在 Go 中是一个特殊的包,整个 Go 程序中**仅允许存在一个名为 main 的包**。 +- main 函数会比较特殊:当你运行一个可执行的 Go 程序的时候,所有的代码都会从这个入口函数开始运行。 +- Gofmt 是 Go 语言在解决规模化(scale)问题上的一个最佳实践,并成为了 Go 语言吸引其他语言开发者的一大卖点。作为 Go 开发人员,请在提交你的代码前使用 **Gofmt 格式化你的 Go 源码**。 + +- 注意点 + - 注意点 1:标准 Go 代码风格使用 Tab 而不是空格来实现缩进的,当然这个代码风格的格式化工作也可以交由 gofmt 完成。 + - 注意点 2:我们调用了一个名为 Println 的函数,这个函数位于 Go 标准库的 fmt 包中。为了在我们的示例程序中使用 fmt 包定义的 Println 函数,我们其实做了两步操作。 + - 注意点 3:我们传入的字符串也就是我们执行程序后在终端的标准输出上看到的字符串。这种“所见即所得”得益于 Go 源码文件本身采用的是 Unicode 字符集,而且用的是UTF-8 标准的字符编码方式 + - 其实 Go 语言的正式语法规范是使用分号“;”来做结尾标识符的, gofmt 在按约定格式化代码时,会自动删除这些被我们手工加入的分号的 + +- Go 语言中程序是怎么编译的? + - Go 是一种编译型语言,这意味着只有你编译完Go 程序之后,才可以将生成的可执行文件交付于其他人,并运行在没有安装 Go 的环境中。 + - Go 提供了 run 命令可以直接运行 Go 源码文件 + - 当然像 go run 这类命令更多用于开发调试阶段,真正的交付成果还是需要使用 go build + +- 复杂项目下 Go 程序的编译是怎样的 + - Go module 构建模式是在 Go 1.11 版本正式引入的,为的是彻底解决 Go 项目复杂版本依赖的问题,在 Go 1.16 版本中,Go module 已经成为了 Go 默认的包依赖管理机制和Go 源码构建机制。 + - Go Module 的核心是一个名为 go.mod 的文件,在这个文件中存储了这个 module 对第三方依赖的全部信息。 + - 其实,一个 module 就是一个包的集合,这些包和 module 一起打版本、发布和分发。go.mod 所在的目录被我们称为它声明的 module 的根目录 + - 我们也可以使用 go mod tidy 命令,让 Go 工具自动添加第三方包 + - go.mod 已经记录了 hellomodule 直接依赖的包的信息。不仅如此,hellomodule 目录下还多了一个名为 go.sum 的文件,这个文件记录了 hellomodule 的直接依赖和间接依赖包的相关版本的 hash 值,用来校验本地包的真实性。 + +### 2.3 标准先行:Go项目的布局标准是什么? +- Go 语言“创世项目”结构是怎样的? + - 用loccount 工具对 Go 语言发布的第一个Go 1.0 版本分析看看: + - ![Go项目的布局标准](pic/Go项目的布局标准.png) + - + + + + + + + diff --git a/code-language/go/pic/Go项目的布局标准.png b/code-language/go/pic/Go项目的布局标准.png new file mode 100644 index 0000000..579d72b Binary files /dev/null and b/code-language/go/pic/Go项目的布局标准.png differ diff --git a/code-language/go/pic/常用配置项.png b/code-language/go/pic/常用配置项.png new file mode 100644 index 0000000..3a55277 Binary files /dev/null and b/code-language/go/pic/常用配置项.png differ