从零开始使用go module方式创建go项目"/>
从零开始使用go module方式创建go项目
1. go的基本语法
自学
2. go的安装
版本:Go 1.13
设置环境变量:
GOPROXY=/,direct
GOPRIVATE=*.corp.example
解释:
- GOPROXY:A Global Proxy for Go Modules
- GOPRIVATE:在下载某些modules的时候,不使用代理或者checksum database。设置如下:GOPRIVATE=*.corp.example,rsc.io/private(多个之间用“,”分割)
3. go的重要目录
- GOROOT:go的安装目录。
- GOPATH: 其实可以把这个目录理解为工作目录
–bin // golang编译可执行文件存放路径
–pkg // golang编译包时,生成的.a文件存放路径,windows的放在pkg/windows_amd64路径下。在module模式下,下载的依赖包存放路径为:GOPATH/pkg/mod
–src // 源码路径。按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。
4. Go语言的Module
1) Module解释:
A module is a collection of related Go packages that are released together.(一起发布的packages的集合)
2) go.mod文件
a) 定义了module的path(一个module包含是go.mod所在的文件夹以及它的子文件夹,直到子文件夹包含go.mod的 时候,又是另一个module)
b) 定义了当前module的引用前缀
3) module路径的解释
a)作为下载路径
Module的路径,不仅仅是作为引用路径,也是作为下载路径的。例如:golang/x/tools的下载路径就是https:// golang/x/tools
b) 作为包的引用:
当module 为github/google/go-cmp,在包为 cmp/目录下的go文件的引用路径为:module的path + 子目录。即包的引用为:github/google/go-cmp/cmp
4) go.mod文件的规范
文件的每行都有一条指令,由一个动作加上参数组成。例如
module my/thing
require new/thing v2.3.4
exclude old/thing v1.2.3
replace bad/thing v1.4.5 => good/thing v1.4.5require (new/thing v2.3.4old/thing v1.2.3
)
- go.mod文件用//注释,而不用/**/
5. Go包规范
1) 对于package
同一个文件夹下的go文件,package要一致。
2) 对于版本号
定义:v x.y.z, z是修订版本号, y是次要版本号原则:如果旧包和新包的导入路径相同,新包必须向后兼容旧的包所以,当版本号从v1.X.X升级到v2.X.X时,要使用不同的包引入路径。从 v2 开始,主版本号必须出现在模块路径的结尾(在 go.mod 文件的 module 语句中声明)。例如,当模块 github/googleapis/gax-go 的开发者们开发完 v2 ,他们用了新的模块路径 github/googleapis/gax-go/v2 。想要使用 v2 的用户必须把他们的包导入和模块要求更改为 github/googleapis/gax-go/v2。
*发布v2代码的时候,需要在github/googleapis/gax-go文件夹下创建个v2文件夹。
6. go的公共包(引用公共包的东西,不需要前缀)
Go的包/
7. 实践:使用module方式创建go项目
1) 创建目录
进入gopath的src目录下,创建文件夹example\cobra-go\hello。
2) 初始化module
在hello目录下使用go mod init example/cobra-go/hello目录来初始化项目,会生成go.mod文件。
3) 创建hello.go文件
package mainimport ("fmt"
)func main() {fmt.Println( "hello")
}
4) 添加依赖
执行命令:go get example/cobra-go/stringutil@v1.1.0 。
会发现文件夹下多了个go.sum。go.mod中也添加了依赖:
require example/cobra-go/stringutil v1.1.0 // indirect
补充: go.sum文件是它是go.mod的补充,使用go.sum文件是为了实现如下目标:
a)提供分布式环境下的包管理依赖内容校验(java的maven是靠中心化的方式管理包的)
b) 作为 transparent log,来加强安全性
5) 在hello.go中引用stringutil.Reverse方法
package mainimport ("fmt""example/cobra-go/stringutil"
)func main() {fmt.Println("hello")fmt.Println(stringutil.Reverse("olleh stringutil.Reverse"))
}
6) 运行和测试(不会生成可执行文件)
- 检查源码包中可能出现的错误:go vet
- 编译并运行:go run hello.go
- 测试代码:go test (前提是要编写hello_test.go测试文件)
7) 编译并生成可执行文件
- a) go build 会在当前文件夹下生成hello.exe文件
无参的go build会搜索当前目录下的go文件进行编译
go build + 文件列表方式
go build + 包 - b) go install 会在GOPATH/bin/ 目录下生成hello.exe文件
- c) 如果在windows下要生成在linux下可以运行的二进制文件,在cmd中执行如下操作:
set GOARCH=amd64
set GOOS=linux
go build hello.go
如果是在powershell命令行中编译,执行如下操作
$env:GOOS="linux"
$env:GOARCH="amd64"
go build hello.go
8) 清理(go clean 命令)
- a) go clean -i
如果执行go clean命令时带有标记-i,则会同时删除安装当前代码包时所产生的结果文件。如果当前代码包中只包含库源码文件,则结果文件指的就是在工作区的pkg目录的相应目录下的归档文件。如果当前代码包中只包含一个命令源码文件,则结果文件指的就是在工作区的bin目录下的可执行文件。 - b) go clean -r
如果执行go clean命令时带有标记-r,则还包括当前代码包的所有依赖包的上述目录和文件。
注:
example/cobra-go/stringutil代码如下:
package stringutilfunc Reverse(s string) string {r := []rune(s)for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {r[i], r[j] = r[j], r[i]}return string(r)
}
更多推荐
从零开始使用go module方式创建go项目
发布评论