Golang中包访问权限的理解问题

Golang中包访问权限的理解问题 大家好,

我是Go语言的新手,正在尝试理解Go的概念,而理解Go的最佳方式就是"开始编写代码"。

因此我正在做一个项目,但在包的使用上遇到了问题。 现在的问题是,我使用了Go模块(即我的项目不在GOPATH中)。我运行了 go mod init github.com/{my-repo}/myproject

项目结构如下:

±-----myproject
|
|------main.go
|
|------internal
|
|----cfg.go

cfg.go 的代码如下:

package internal

import "fmt"

func Test(){
    fmt.Println("This is just for testing")
}

go.mod 的输出为:

module github.com/rajeshcjain/DBCleanUpJob

go 1.12

main.go 文件如下:

package DBCleanUpJob

import "./internal"

func main() {
    internal.Test()
}

当我使用 go build main.go 运行此代码时,出现以下错误:

main.go:3:8: unknown import path “_/Users/rajeshjain/projects/RiversProjects/DBCleanUpJob/internal”: internal error: module loader did not resolve import

请问能否帮我解决这个问题……为什么会出现这个异常?

除此之外,我阅读了一些博客,了解到项目中的 internal 模块用于限制包的访问范围,因为Go过去只有本地和全局访问权限……为了克服这一点,我们使用 internalinternal 可以被层次结构中比它更高的包访问,例如 a/b/c/internal/d/e/f,那么 a/b/c 将能够访问 internal 包……但对于与 internal 处于同一级别的包,它们是否能够访问它呢?

此外,一些博客中的人建议在 GOPATH 中创建项目,然后访问 internal 项目……这让我感到困惑,因为如果必须这样做,那么Go中引入模块的意义何在……这似乎是模块的失败。

提前感谢。 此致


更多关于Golang中包访问权限的理解问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

你好。我会导入 http://github.com/rajeshcjain/DBCleanUpJob/internal
作为替代

更多关于Golang中包访问权限的理解问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


抱歉,我以为代码在 DBCleanUpJob 的子文件夹 internal 中。

但是,我需要将代码复制到那个位置吗?

如果必须复制到那里,那使用 go mod 还有什么意义呢?

在Go模块中,internal包的使用和导入路径的解析方式需要遵循模块的规则。你的问题主要源于导入路径的写法不正确。

问题分析:

  1. 在Go模块中,应该使用完整的模块路径进行导入,而不是相对路径
  2. internal包的作用域规则在模块中仍然适用

解决方案:

修改你的main.go文件,使用完整的模块导入路径:

package main

import "github.com/rajeshcjain/DBCleanUpJob/internal"

func main() {
    internal.Test()
}

同时,确保你的cfg.go文件在正确的包中:

package internal

import "fmt"

func Test() {
    fmt.Println("This is just for testing")
}

构建命令: 不要使用go build main.go,而是使用:

go build

或者

go run .

关于internal包的作用域:

在模块系统中,internal包的访问规则如下:

  • 只有与internal目录在同一个模块内的包才能访问它
  • 在同一个模块中,任何包都可以访问internal包,无论它们在目录结构中的位置
  • 其他模块无法访问该internal

示例项目结构:

myproject/
├── go.mod
├── main.go
└── internal/
    └── cfg.go

在这种情况下:

  • main.go可以访问internal包(在同一个模块内)
  • 其他模块无法导入github.com/rajeshcjain/DBCleanUpJob/internal

验证示例:

创建一个简单的测试来验证访问权限:

// internal/cfg.go
package internal

import "fmt"

var Config = "database config"

func Test() {
    fmt.Println("Internal package test:", Config)
}
// main.go
package main

import (
    "fmt"
    "github.com/rajeshcjain/DBCleanUpJob/internal"
)

func main() {
    internal.Test()
    fmt.Println("Accessing internal variable:", internal.Config)
}

运行go run .应该能正常输出:

Internal package test: database config
Accessing internal variable: database config

这样就能正确使用Go模块和internal包的访问控制功能了。

回到顶部