go包和模块

一、go包

1、两个名词

1)*.go内声明的package名,这里简称为packageName

2)*.go所在的文件夹名,这里简称为directoryName

2、先说结论

1)packageName和directoryName不强制同名

2)同一目录下的packageName必须一致,否则编译错误

3)import directoryName,而非packageName

3、示例

1)当前有工程结构如下

1
2
3
4
go-project
|__go.mod
|__util
|__Echo.go

2)Echo.go内声明的package为utils可以和目录名util不同

1
2
3
4
5
6
7
package utils

import "fmt"

func Echo(msg string) {
fmt.Print(msg)
}

二、go模块

1、两个名词

1)go.mod内声明的module名,这里简称为moduleName

2)go工程所在的远程仓库地址,这里简称为gitUrl

2、先说结论

如果go工程要被其他项目引用,moduleName和gitUrl必须一致。

3、依赖解析流程

go.mod引入模块的流程为:

  1. 根据指定的模块名称,下载指定仓库的指定版本到$GOPATH/src/[modulename]
  2. 解析下载的模块go.mod
    • 校验go.mod内声明的module名称是否和引用的一致,若不一致引入失败。
    • 引入模块的依赖,重复以上步骤

4、示例

1)go-project/go.mod声明当前module为go-project

1
2
3
module go-project

go 1.18

2)提交go-project至github.com/kivihub/go-project

3)其他项目执行go get -u github.com/kivihub/go-project,报错

1
2
3
4
# go get -u github.com/kivihub/go-project@ef72191d
go: github.com/kivihub/go-project@v0.0.0-20220610031119-ef72191dbee9: parsing go.mod:
module declares its path as: go-project
but was required as: github.com/kivihub/go-project

评论