Golang中子文件夹能否拥有自己的模块

Golang中子文件夹能否拥有自己的模块 大家好,

我在如何编写Go代码中读到:

模块包含其 go.mod 文件所在目录中的包,以及该目录的子目录,直到下一个包含另一个 go.mod 文件的子目录(如果有的话)。

我可以在父文件夹和子文件夹中分别拥有独立的模块吗?例如:a/go.mod, a/b/go.mod。

我可以在父模块中使用子模块中导出的名称吗?

谢谢

|____a
| |____go.mod
| |____a.go
| |____b
| | |____go.mod
| | |____b.go

更多关于Golang中子文件夹能否拥有自己的模块的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

看起来是正确的

更多关于Golang中子文件夹能否拥有自己的模块的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢Jeff。

我现在明白了。如果我的理解有误,请指正。

  • 一个文件夹包含一个模块。只能有一个go.mod文件
  • 一个文件夹包含一个包。其内部的所有源文件都声明使用相同的包名
  • 子文件夹中不能有子模块
  • 子文件夹中可以有子包

引用自 ljh:

如何编写Go代码

其中也提到:“一个Go代码仓库通常只包含一个模块,位于仓库的根目录。” 并且这里说,“如果我们在子目录 world 中创建代码,我们不需要(也不应该)在那里运行 go mod init。”

为了让你的生活更轻松,请不要那样做。如果你的代码应该打包成两个模块,请将它们放在独立的目录树中。如果你有相关的包,请将它们保留在一个模块内。不要混淆包和模块。包是为了组织和命名空间,模块是为了分发和版本控制。

是的,可以在父文件夹和子文件夹中分别拥有独立的模块。根据Go模块的设计,每个包含go.mod文件的目录都是一个独立的模块根目录,子目录中的go.mod文件会创建一个新的模块边界。

在你的示例结构中:

  • a/go.mod 定义了模块A
  • a/b/go.mod 定义了模块B(独立的子模块)

重要规则

  1. 子模块是完全独立的模块,有自己的依赖管理和版本控制
  2. 父模块不能直接导入子模块的包,因为它们属于不同的模块
  3. 子模块需要被当作外部依赖来使用

示例代码

假设有以下结构:

a/
├── go.mod        # module example.com/a
├── a.go
└── b/
    ├── go.mod    # module example.com/b
    └── b.go

a/b/go.mod:

module example.com/b

go 1.21

a/b/b.go:

package b

import "fmt"

func Hello() {
    fmt.Println("Hello from module B")
}

要在父模块中使用子模块,你需要:

  1. 将子模块发布到版本控制系统(或使用replace指令本地开发)

  2. 在父模块中导入子模块作为依赖

a/go.mod:

module example.com/a

go 1.21

require example.com/b v0.0.0

replace example.com/b => ./b

a/a.go:

package main

import (
    "example.com/b"
)

func main() {
    b.Hello()
}

替代方案:如果你不需要独立的模块管理,建议使用单个模块,将子目录作为包:

a/
├── go.mod        # module example.com/a
├── main.go
└── b/
    └── b.go      # package b

这样可以直接导入:

import "example.com/a/b"

关键点

  • 子模块需要独立的版本管理和发布
  • 父模块通过require导入子模块
  • 开发时可以使用replace指令指向本地路径
  • 每个模块的导入路径必须唯一且可访问
回到顶部