Files
build-web-application-with-…/zh/01.2.md
josedelinux a36d4ce81f Update 01.2.md
修正错误
2021-07-21 17:25:16 +08:00

257 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 1.2 Go Module, GOPATH 与工作空间
从 Go1.11 开始, Go 官方加入 Go Module 支持, Go1.12 成为默认支持; 从此告别源码必须放在 Gopath 中
以及 Gopath 对初学者造成的困扰.
## 使用 Go Module
由于众所周知的原因, 要顺利安装 Go Module 的包, 需要先设置代理:
公共模块代理:
```sh
export GOPROXY=https://goproxy.io // 也可以设置为 https://goproxy.cn 或者其他
```
私有模块代理:
```sh
export GOPRIVATE=git.xxx.com
```
初始化:
```
go mod init [module 名称]
```
检测和清理依赖:
```
go mod tidy
```
安装指定包:
```
go get -v github.com/go-ego/gse@v0.60.0-rc4.2
```
### 更新依赖
```
go get -u
```
更新指定包依赖:
```
go get -u github.com/go-ego/gse
```
指定版本:
```
go get -u github/com/go-ego/gse@v0.60.0-rc4.2
```
### Replace:
使用命令行:
```
go mod edit -replace github.com/go-ego/gse=/path/to/local/gse
go mod edit -replace github.com/go-ego/gse=github.com/vcaesar/gse
```
也可以直接修改模块文件:
```
replace github.com/go-ego/gse => github.com/vcaesar/gse
```
## GOMODULE 常用命令:
```
go mod init # 初始化 go.mod
go mod tidy # 更新依赖文件
go mod download # 下载依赖文件
go mod vendor # 将依赖转移至本地的 vendor 文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖
```
前面我们在安装 Go 的时候看到需要设置 GOPATH 变量Go 从1.1版本到1.7必须设置这个变量而且不能和Go的安装目录一样这个目录用来存放Go源码Go的可运行文件以及相应的编译之后的包文件。所以这个目录下面有三个子目录src、bin、pkg
从go 1.8开始GOPATH 环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go,在Windows上默认为%USERPROFILE%/go。
## GOPATH设置
go 命令依赖一个重要的环境变量:$GOPATH
Windows系统中环境变量的形式为`%GOPATH%`本书主要使用Unix形式Windows用户请自行替换。
*这个不是Go安装目录。下面以笔者的工作目录为示例如果你想不一样请把GOPATH替换成你的工作目录。*
在类 Unix 环境下大概这样设置:
```sh
export GOPATH=/home/apple/mygo
```
为了方便,应该新建以上文件夹,并且上一行加入到 `.bashrc` 或者 `.zshrc` 或者自己的 `sh` 的配置文件中。
Windows 设置如下新建一个环境变量名称叫做GOPATH
```sh
GOPATH=c:\mygo
```
GOPATH允许多个目录当有多个目录时请注意分隔符多个目录的时候Windows是分号Linux系统是冒号当有多个GOPATH时默认会将go get的内容放在第一个目录下。
以上 $GOPATH 目录约定有三个子目录:
- src 存放源代码(比如:.go .c .h .s等
- pkg 编译后生成的文件(比如:.a
- bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中如果有多个gopath那么使用`${GOPATH//://bin:}/bin`添加所有的bin目录
以后我所有的例子都是以mygo作为我的gopath目录
## 代码目录结构规划
GOPATH下的src目录就是接下来开发程序的主要目录所有的源码都是放在这个目录下面那么一般我们的做法就是一个目录一个项目例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用这个根据package是main还是其他来决定main的话就是可执行应用其他的话就是应用包这个会在后续详细介绍package。
所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹文件夹名称一般是代码包名称当然也允许多级目录例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb"包名称是最后一个目录beedb
下面我就以mymath为例来讲述如何编写应用包执行如下代码
```sh
cd $GOPATH/src
mkdir mymath
```
新建文件sqrt.go内容如下
```go
// $GOPATH/src/mymath/sqrt.go源码如下
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
```
这样我的应用包目录和代码已经新建完毕注意一般建议package的名称和目录名保持一致
## 编译应用
上面我们已经建立了自己的应用包,如何进行编译安装呢?有两种方式可以进行安装
1、只要进入对应的应用包目录然后执行`go install`,就可以安装了
2、在任意的目录执行如下代码`go install mymath`
安装完之后,我们可以进入如下目录
```sh
cd $GOPATH/pkg/${GOOS}_${GOARCH}
//可以看到如下文件
mymath.a
```
这个.a文件是应用包那么我们如何进行调用呢
接下来我们新建一个应用程序来调用这个应用包
新建应用包mathapp
```sh
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
```
`$GOPATH/src/mathapp/main.go`源码:
```go
package main
import (
"mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
```
可以看到这个的package是`main`import里面调用的包是`mymath`,这个就是相对于`$GOPATH/src`的路径如果是多级目录就在import里面引入多级目录如果你有多个GOPATH也是一样Go会自动在多个`$GOPATH/src`中寻找。
如何编译程序呢?进入该应用目录,然后执行`go build`那么在该目录下面会生成一个mathapp的可执行文件
```sh
./mathapp
```
输出如下内容
```sh
Hello, world. Sqrt(2) = 1.414213562373095
```
如何安装该应用,进入该目录执行`go install`,那么在$GOPATH/bin/下增加了一个可执行文件mathapp, 还记得前面我们把`$GOPATH/bin`加到我们的PATH里面了这样可以在命令行输入如下命令就可以执行
```sh
mathapp
```
也是输出如下内容
Hello, world. Sqrt(2) = 1.414213562373095
这里我们展示如何编译和安装一个可运行的应用,以及如何设计我们的目录结构。
对于启用go module的Go版本需要对mod.go进行配置。使用replace的方式将远程包替换为本地包
## 获取远程包
go语言有一个获取远程包的工具就是`go get`目前go get支持多数开源社区(例如GitHub、googlecode、bitbucket、Launchpad)
go get github.com/astaxie/beedb
>go get -u 参数可以自动更新包而且当go get的时候会自动获取该包依赖的其他第三方包
通过这个命令可以获取相应的源码对应的开源平台采用不同的源码控制工具例如GitHub采用git、googlecode采用hg所以要想获取这些源码必须先安装相应的源码控制工具
通过上面获取的代码在我们本地的源码相应的代码结构如下
$GOPATH
src
|--github.com
|-astaxie
|-beedb
pkg
|--相应平台
|-github.com
|--astaxie
|beedb.a
go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面然后执行`go install`
在代码中如何使用远程包很简单的就是和使用本地包一样只要在开头import相应的路径就可以
import "github.com/astaxie/beedb"
## 程序的整体结构
通过上面建立的我本地的mygo的目录结构如下所示
bin/
mathapp
pkg/
平台名/ 如darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
从上面的结构我们可以很清晰的看到bin目录下面存的是编译之后可执行的文件pkg下面存放的是应用包src下面保存的是应用源代码
## links
* [目录](<preface.md>)
* 上一节: [安装Go](<01.1.md>)
* 下一节: [GO 命令](<01.3.md>)