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