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过去只有本地和全局访问权限……为了克服这一点,我们使用 internal。internal 可以被层次结构中比它更高的包访问,例如 a/b/c/internal/d/e/f,那么 a/b/c 将能够访问 internal 包……但对于与 internal 处于同一级别的包,它们是否能够访问它呢?
此外,一些博客中的人建议在 GOPATH 中创建项目,然后访问 internal 项目……这让我感到困惑,因为如果必须这样做,那么Go中引入模块的意义何在……这似乎是模块的失败。
提前感谢。 此致
更多关于Golang中包访问权限的理解问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好。我会导入 http://github.com/rajeshcjain/DBCleanUpJob/internal
作为替代
更多关于Golang中包访问权限的理解问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
抱歉,我以为代码在 DBCleanUpJob 的子文件夹 internal 中。
在Go模块中,internal包的使用和导入路径的解析方式需要遵循模块的规则。你的问题主要源于导入路径的写法不正确。
问题分析:
- 在Go模块中,应该使用完整的模块路径进行导入,而不是相对路径
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包的访问控制功能了。


