Golang子文件夹中的模块V0实现探讨

Golang子文件夹中的模块V0实现探讨 是否可以将我的Go模块的v0和v1版本放入带版本号的子目录中(类似于v2+的做法),还是代码必须始终位于模块的根目录下?

3 回复

Andrew_Smith1:

代码是否必须始终位于模块的根目录下?

当前版本的代码?

更多关于Golang子文件夹中的模块V0实现探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我希望在 v0 子文件夹中进行初始开发,然后移动到 v1 文件夹中的 v1 版本,再到 v2 文件夹中的 v2 版本,依此类推。这样,所有版本都可以以类似的方式提供,并且可以通过主版本号显式导入。

这里值得理解我的使用场景。我正在从某些版本化的模式生成代码,并且我希望对所有主版本都以相同的方式生成代码,而不必特殊处理 v0 和 v1。

一个相关的问题是,既然 v1 文件似乎需要放在根目录(即当前 v0 文件所在的位置),那么如何同时支持 v0 和 v1 呢?

在Go模块系统中,v0和v1版本确实需要将代码保持在模块根目录下,这与v2+版本的处理方式不同。根据Go的语义导入版本控制规则,只有主版本号v2及以上才需要在模块路径或子目录中体现版本号。

关键区别:

  • v0/v1:代码必须位于模块根目录,模块路径不包含版本号
  • v2+:可以选择在模块路径中添加/v2后缀,或将代码放入v2/子目录

示例结构对比:

// v0/v1的正确结构(代码在根目录)
my-module/
├── go.mod      // module github.com/user/my-module
├── main.go
└── pkg/
    └── utils.go

// v2+的正确结构(使用子目录)
my-module/
├── go.mod      // module github.com/user/my-module
├── v2/
│   ├── go.mod  // module github.com/user/my-module/v2
│   ├── main.go
│   └── pkg/
│       └── utils.go
└── v1代码可保留在根目录

实际导入示例:

// 导入v1版本
import "github.com/user/my-module/pkg"

// 导入v2版本(使用子目录方式)
import "github.com/user/my-module/v2/pkg"

如果尝试为v0/v1创建版本化子目录,Go工具链会将其视为不同的模块,可能导致依赖解析问题。这种设计确保了v0(开发中)和v1(稳定API)版本的向后兼容性承诺,而v2+则明确表示包含破坏性变更。

回到顶部