go的基本语法

1. go的基本语法

自学

2. go的安装

版本:Go 1.13

设置环境变量:

GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
GOPRIVATE=*.corp.example.com12

解释:

  • GOPROXY:A Global Proxy for Go Modules

  • GOPRIVATE:在下载某些modules的时候,不使用代理或者checksum database。设置如下:GOPRIVATE=*.corp.example.com,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.org/x/tools的下载路径就是https:// golang.org/x/tools
b) 作为包的引用:
当module 为github.com/google/go-cmp,在包为 cmp/目录下的go文件的引用路径为:module的path + 子目录。即包的引用为:github.com/google/go-cmp/cmp

4) 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
  • 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.com/googleapis/gax-go 的开发者们开发完 v2 ,他们用了新的模块路径 github.com/googleapis/gax-go/v2 。想要使用 v2 的用户必须把他们的包导入和模块要求更改为 github.com/googleapis/gax-go/v2。1234

*发布v2代码的时候,需要在github.com/googleapis/gax-go文件夹下创建个v2文件夹。

6. go的公共包(引用公共包的东西,不需要前缀)

Go的包https://golang.google.cn/pkg/

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

会发现文件夹下多了个go.sum。go.mod中也添加了依赖:
require example.com/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.com/cobra-go/stringutil")func main() {
    fmt.Println("hello")
    fmt.Println(stringutil.Reverse("olleh stringutil.Reverse"))}123456789101112

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=amd64set GOOS=linux
go build hello.go123

如果是在powershell命令行中编译,执行如下操作

$env:GOOS="linux"$env:GOARCH="amd64"go build hello.go123

8) 清理(go clean 命令)

  • a) go clean -i
    如果执行go clean命令时带有标记-i,则会同时删除安装当前代码包时所产生的结果文件。如果当前代码包中只包含库源码文件,则结果文件指的就是在工作区的pkg目录的相应目录下的归档文件。如果当前代码包中只包含一个命令源码文件,则结果文件指的就是在工作区的bin目录下的可执行文件。

  • b) go clean -r
    如果执行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)

发表评论

上一篇: 使用Go Modules 下一篇: go安装模块