从零开始使用go module方式创建go项目

1. go的基本语法

自学

2. go的安装

版本:Go 1.13

设置环境变量:

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

解释:

  • 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.4
exclude old/thing 		v1.2.3
replace bad/thing 		v1.4.5 	=> good/thing v1.4.5

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

*发布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。
2) 初始化module
在hello目录下使用go mod init example.com/cobra-go/hello目录来初始化项目,会生成go.mod文件。
3) 创建hello.go文件
package main

import (
    "fmt"
)

func main() {
    fmt.Println( "hello")
}
4) 添加依赖
执行命令:go get example.com/cobra-go/stringutil@v1.1.0 。

会发现文件夹下多了个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 main

import (
    "fmt"

    "example.com/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.com/cobra-go/stringutil代码如下:

package stringutil

func 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)
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值