1. 总览
package main
import (
test2 "biturd/test"
"biturd/test/test"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/ginS"
// "github.com/gin-gonic/gin/internal/json" 编译器直接不允许了
)
func main() {
// 首先gin的包就叫gin, 只有gin直接目录下的文件【package gin】才能被其他开发者直接引用
// 内层虽然为是间接目录,但go语言只认package,不care目录结构。也不管你跨了几级引用,比如internal垮了两个目录。
gin.Default()
ginS.Any("")
_ = test.A
_ = test2.B
}
只有internal会用到模块的概念,区分模块内外。其他的通通按照包的路径直接引用。
所以在自己写模块的时候遵循以下原则,【个人认为】
- 最外围尽量简单,比如gin主包下只放核心逻辑。
- 封装特性,一方面通过大小写控制包层级下的变量、函数的导出,一方面通过模块层级下的internal路径包,控制包层级的导出。【比如开发中的业务逻辑,在web开发中主要是在这个模块中写代码】
- 复用原则,可以将许多其他模块可能能用到的逻辑,放到internal外面一个功能写一个包,调用者也容易区分。
自己写的包如何在本地仓库中更新。
go install
【go build只是编译成exe,加到bin目录下面,但是没有src下面的源码,go没有中间产物,所以要引用的话,引用的也是src】【java交付的是class,class对外隐藏细节,go直接exe对外隐藏细节】
2. go mod
【有了它,就不需要严格按照原生go的目录结构,必须在go path的src目录下放代码】
go mod init <package名字>
go mod download [下载当前mod下的包]
go mod vendor [生成引用的包的复制目录,这个是dep里遗留的,go mod中接近废弃] 原来使用的本意是先在项目verdor中找,再在goPath中找。
3. go dep工具【Gopkg.toml】
淘汰了,不要用了。