go 中提供了需要内置的标准库。比如 fmt、os、time。当然很多时间需要我们自定义包。

自定义包的格式

包的命名规范

  • 不含有 _(下划线)的小写单词来为文件命名。
  • 包名可以和文件夹的名称不一致
  • 同一个目录下的go代码的package 保持一致

导入包

使用import 关键字创建 导入一个包的路径和url地址

import “包的路径或 URL 地址”

导入包推荐使用绝对路径,不推荐使用相对路径

示例:

1
2
3
4
5
6
7
8
package package1

import "fmt"

func ShowMessage() {
fmt.Print("显示信息")
}

1
2
3
4
5
6
7
8
9
10

import (
pa "com/demo/package1"

}

func TestPackage(t *testing.T) {
pa.ShowMessage()
}

包内的可见性

包内的函数是否能被其他的包访问是通过函数名称的首字母是否大小写来表示的。
如果函数首字母是小写,那么不能被其他包访问。
如果函数首字母是大写,那么能够被其他包访问。

远程包

go 也支持一些远端的库,就像java的maven仓库,一般库都是放到github上的。

搜索 go 类库的地址 https://pkg.go.dev/

通过
go get xxx 获取远程的包

init 方法

一个包内可以定义多个init 方法,在调用包内的方法的时候,init 方法安装顺序执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package package1

import "fmt"

func ShowMessage() {
fmt.Print("显示信息")
}

func init() {
fmt.Println("init1")
}

func init() {
fmt.Println("init2")
}


func init() {
fmt.Println("init3")
}


调用方法

1
2
3
4
5
6

func TestPackage(t *testing.T) {
pa.ShowMessage()
}


执行结果

1
2
3
4
5
6
init1
init2
init3
=== RUN TestPackage
显示信息--- PASS: TestPackage (0.00s)
PASS

init执行顺序

  • 每个包可以有多个init,按照从上到下的顺序执行
  • 多个依赖包的时候,按照依赖的顺序依次执行每个包的init 方法

包的管理

go 有多种包的管理方式,分别是 go path,vendor,go mod
现在推荐使用go mod 的方式来管理包.

命令

  • go get 下载远程包,使用http协议或git协议
    -d 仅下载依赖包
    -u 更新并安装
    -v 打印构建的包
    -x 打印执行的命令

设置go 代理

配置通过代理站获取go 包的依赖

1
		

其他的常用代理

1
2
3
4
5
6
7
8
goproxy.io
https://goproxy.io,direct

七牛云
https://goproxy.cn

阿里云
https://mirrors.aliyun.com/goproxy/

go path

go path 是将所有的工程代码要求放在GOPATH/src目录下,此种方式已经不推荐使用了。
go path 有3个目录
bin 二进制文件
pkg 依赖包的文件
src 源码文件

这种方式 通过 go build go install 都会将文件打包到对应的GOPath的目录中

go vendor

go vendor 是在项目中可以创建一个名字为vendor 的目录。

Go vendor 查找包的路径

当前包的 vendor –> src 下的vendor –> GOPATH –> GOROOT

目前 Go vendor 官方自己都不推荐使用这种方式,推荐使用go mod的方式了。

Go vendor 主要是为了将多个项目的依赖分离,不用都在一个GOPATH下。

~~go mod ~~

go mod 主要的功能

  • 自动下载第三方包
  • 版本控制
  • 不用设置goPath,代码可任意放置
  • replace机制 (主要解决包的外网访问问题,如果使用了go proxy后可以不使用此功能)

go mod 相关的命令

  • go mod init 当前目录下初始化mod
  • go mod tidy 删除没有用到的依赖
  • go mod download 只下载三方依赖

需要注意的是go mod 使用的时候记得把当前项目从go path中移除,go path 和go mod 不能共存

go mod 引入三方依赖

  1. 创建一个目录,并初始化为go mod

假设在一个web目录下初始化web mod

1
go mod init web
  1. 搜索依赖包 https://pkg.go.dev/ ,并在 需要的方法中引用
1
2
3
4
5
6
7
8
9
10

package main

import "github.com/astaxie/beego"


func main() {
beego.Run()
}

  1. 下载和运行
1
go build

一般情况下能自动下载依赖

如果出现错误提示

webrun.go:3:8: no required module provides package github.com/astaxie/beego; to add it:
go get github.com/astaxie/beego

那么使用go get 手动下载

1
go get github.com/astaxie/beego
  1. 运行并访问

在mod 文件的require 中自动加入了包的依赖信息。

发布依赖到github

  1. 创建一个自定义mod

1
2
3
4
5
6
7
8
9
10
11
package strutil

import "strings"


func StrUpper(str string) string {

return strings.ToUpper(str)
}


初始化

1
2
go mod init github.com/wangshaokaicoder/strutil

注意 mod的名称需要加上对应的仓库的名称和路径,比如github 仓库必须是github.com 当然也可以使用其他的仓库,比如gitlab 等。

  1. 在github 创建一个仓库并提交

仓库名称和 包名一致 strutil

将当前的目录添加到git中

1
2
3
4
5
6
7

git init
git add .
git commit -m ""
git remote add origin git@github.com:wangshaokaicoder/strutil.git
git push -u origin main

  1. 使用对应的包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
str "github.com/wangshaokaicoder/strutils"
)



func main() {
ret := str.StrUpper("aa")
fmt.Println(ret)
}

执行命令

1
2
3
go build

go get xxxxx