Go 中的相对导入

新手上路,请多包涵

我有一个具有以下目录结构的项目

utils(pkg)
   | auth.go (has a function names test1)
controllers(pkg)
   | login.go (has a function names test2)

我正在尝试从 login.go 访问函数 test1。这是我所做的

import "../utils"

func test2(c *gin.Context) bool{
      utils.test1()
}

但我总是得到 Unresolved reference test1 。我是新来的。谁能帮助我为什么会收到此错误?

原文由 codec 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 713
2 个回答

不,Go 中没有相对导入。

考虑到 GOPATH,你应该使用绝对路径:

GOPATH 环境变量指定工作区的位置。它可能是您在开发 Go 代码时需要设置的唯一环境变量。首先,创建一个工作区目录并相应地设置 GOPATH。请参阅: https ://golang.org/doc/code.html#GOPATH

导入路径

导入路径是唯一标识包的字符串。包的导入路径对应于它在工作区或远程存储库中的位置(如下所述)。

来自标准库的包被赋予了简短的导入路径,例如“fmt”和“net/http”。对于您自己的包,您必须选择一个基本路径,该路径不太可能与将来添加到标准库或其他外部库中的内容发生冲突。

如果您将代码保存在某个源存储库中,那么您应该使用该源存储库的根目录作为您的基本路径。例如,如果您在 github.com/user 上有一个 GitHub 帐户,那应该是您的基本路径

请注意,您无需先将代码发布到远程存储库即可构建它。把你的代码组织起来就像你有一天会发布它一样,这只是一个好习惯。实际上,您可以选择任意路径名,只要它对标准库和更大的 Go 生态系统是唯一的。

例子:

此示例假定您已在操作系统环境中设置了 GOPATH=/goworkdir

文件: goworkdir/src/project1/utils/auth.go

 package utils

func Test1() string {
    return "Test1"
}

文件: goworkdir/src/project1/controllers/login.go

 package controllers

import "project1/utils"

func Test2() string {
    return utils.Test1()
}

文件: goworkdir/src/project1/main.go

 package main

import (
    "fmt"
    "project1/controllers"
)

func main() {
    fmt.Println(controllers.Test2())
}

现在如果你 go run main.go 你应该看到输出:

 Test1

原文由 user6169399 发布,翻译遵循 CC BY-SA 4.0 许可协议

自从引入 go 模块以来,这与 go 1.11 不同。

因此,如果您切换到 go 模块,并且您的模块名为“m”,那么在项目树中进行相对导入的惯用方法是使用: import "m/utils"import "m/controllers" 在您需要在项目中导入这些包的地方。详情参见: https ://github.com/golang/go/wiki/Modules#do-modules-work-with-relative-imports-like-import-subdir


GoLand 用户- 默认情况下,这些形式的导入在 IDE 中显示为错误。您需要在设置中启用 Go Modules 集成

在此处输入图像描述

原文由 marni 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏