如何解决本地导入包
我有一个包,我想用 foo
来分解我的代码,它位于一个名为 utils
的子目录中。当我尝试将它导入我的 main.go 时,它找不到它。不知道我做错了什么。
运行 go build
时出错
错误:
main.go:7:2: local import "./utils/csrf" in non-local package
所以我的文件夹结构如下:
github.com/project
/utils
foo.go
main.go
包是这样写的:
package foo
import (
"fmt"
)
func Bar() {
fmt.Printf("function")
}
去模组:
module github.com/project
go 1.15
而且我正在尝试在我的 main.go
文件中导入。
import (
"fmt"
"github.com/project/utils/foo"
)
解决方法
首先,在某处创建一个文件夹 utils
。你不需要做任何
github.com/project
文件夹。只需简单地创建一个 utils
文件夹,然后将其放入
硬盘上的某个地方。然后进入该文件夹,并执行go mod init github.com/project/utils
。然后使utils/foo.go
:
package utils
import "fmt"
func Bar() {
fmt.Println("function")
}
然后创建一个文件夹 utils/utils
。然后制作一个文件utils/utils/main.go
:
package main
import "github.com/project/utils"
func main() {
utils.Bar()
}
然后执行go build
。完成。
错误消息 main.go:7:2: local import "./utils/csrf" in non-local package
来自 here。除非出现意外错误,否则这意味着您的 main.go
确实不看起来像:
import (
"fmt"
"github.com/project/utils/foo"
)
正如你所描述的,但更像是:
import (
"fmt"
"./utils/foo"
)
但是,relative import paths 不能在模块模式下的 import
语句中使用。 (由于 go
命令中的错误,您在模块模式下获得的实际错误消息有些令人困惑,我已为此提交了 https://golang.org/issue/47088。)
在模块模式下,在 go.mod
文件中声明的模块路径(对于您的示例大概是 module github.com/project
)是导入路径的前缀,您打算在 {{ 1}} 语句。
所以这里的解决方案很可能是:
-
import
到cd
文件夹。 - 运行
project
。 - 更改
go mod init github.com/project
语句以在整个项目中使用完整路径而不是相对路径:import
这应该将您的 $ sed -i 's,"\./utils,"github.com/project/utils,' $(find -name *.go)
更改为实际上阅读:
main.go
但是现在还有一个步骤:Go 只支持每个目录一个包,并且在 import (
"fmt"
"github.com/project/utils/foo"
)
源文件中用 package
指令声明的包名称是(可能令人困惑!)不是包导入路径的后缀——它是完全独立的。
因此,为了使 .go
语句起作用,您需要一个额外的目录结构层:
import
mkdir utils/foo
现在您有一个模块 mv utils/foo.go utils/foo/foo.go
,其中包含两个包:github.com/project
带有源文件 github.com/project
,./main.go
带有源文件 github.com/project/utils/foo
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。