Go的目录结构以及如何引用自己写的包

时间:2024-02-22 15:04:40

一、 目录结构

1)在gopath模式下

作为一个workspace,需要包含src、pkg、bin三个目录


workspace(/root/code/go)

|-- src //源码目录(自己写的工程,或是go get获取的工程)

        |-- 我的工程

                |--vendor //可选,该工程依赖的三方包

|-- pkg //编译生成的静态包文件(一般为.a文件)

|-- bin //go可执行工具目录(执行go install后会复制到此目录下)


设置环境变量:

export GOPATH=/root/code/go

export GOROOT=/usr/local/go

export PATH=$PATH:$GOROOT/bin:$GOPATH/bin


源码:必须放在src目录下

依赖包:放在src目录下(一般通过go get获取),或是放在”我的工程“目录下自己新建的vendor目录里。


2)在go mod模式下

源码可以放在任意地方,go mod依赖包会先下载到pkg目录,保存为cach文件再解压,以包名+版本号进行版本区分,如grpc@v1.28.0

源码:任意位置

依赖包:告别vendor目录,通过go mod管理,会下载到pkg目录下。


go mod常用命令

  • go mod init # 初始化当前目录为模块根目录,生成go.mod, go.sum文件
  • go mod download # 下载依赖包
  • go mod tidy #整理检查依赖,如果缺失包会下载或者引用的不需要的包会删除
  • go mod vendor #复制依赖到vendor目录下面
  • go mod 可看完整所有的命令
  • go mod graph 以文本模式打印模块需求图
  • go mod verify 验证依赖是否正确
  • go mod edit 编辑go.mod文件

二、引用自定义包

引用自定义包实例:

这里go mod init mytest,故意将module名和目录配置不一样。

root# cat go.mod

module mytest

go 1.14

工程目录结构如下:

例1:import "mytest/mdAbc"

mytest为go mod 的module名

./mdAbc目录名和包同名

直接import "mytest/mdAbc"

例2:import "mytest/json_test/jsonmode"

mytest为go mod 的module名

./json_test包名和子目录同名,都是jsonmode,因此直接import "mytest/json_test/jsonmode"

当然也可以取别名的方式:xx "mytest/json_test/jsonmode"

例3:import hi "mytest/mdHi"

目录./mdHi和包(hi)不同名,只能以取别名的方式import

例4:import wo "mytest/mdWo"

目录./mdWo和包(wo)不同名,只能以取别名的方式import

例5:import ha "mytest/mdWo/mdHa"

目录./mdWo/mdHa和包(ha)不同名,只能以取别名的方式import