Golang Go语言中,如何 import 上一层目录的 package?

在 Go 语言中,如何 import 上一层目录的 package ?

以及

https://github.com/gogits/gogs/blob/master/cmd/web.go 直接通过 import url 的方式引用该项目中的其它 package 的做法,是否推荐使用?
Golang Go语言中,如何 import 上一层目录的 package?


更多关于Golang Go语言中,如何 import 上一层目录的 package?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

嘛…他就是这么用的
其实也有 relative import

更多关于Golang Go语言中,如何 import 上一层目录的 package?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


能否讲的具体一些?

推荐使用完整的包名

其实就是写你从 gopath 找进去的路径,也就是写全整个路径
Go 也有 relative import ,好像是不推荐?

举个例子?

比如在 project path 的 src 目录下有文件夹三层目录为 github.com/Comdex/octopus ,在 octopus 目录下放着名为 octopus 的包,那么只要你把 project path 目录设为 gopath 后,在任何存在于 gopath 路径的 go 源码中都可以用 import "github.com/Comdex/octopus"这样完整的路径进行导入

不能, 我也遇到过这个问题

我之前一个 main 包的 cmd 子包想引用 main 包的 Version 变量 无解.

可以
import foo "…"

不过不要这样做,用绝对路径最好,不然没法 go get


main 包是不能 import 的,既然有 cmd ,那上面一层就不应该是 main 包

你看到的是 url ,其实是 go get 下来的包,你去你自己机器的 gopath 路径下的 src 目录下看看就知道,官方不提倡相对路径式的引用,某些情况下会造成歧义,但是既然官方提供了,说明用也没什么问题
相对路径的当路径始终是 gopath 指向的路径,你可以在不同的目录下执行这段代码,来体会一下:
dir, err := filepath.Abs("./")
if err != nil {
fmt.Println(err)
}
fmt.Println(dir)

在Go语言中,直接通过相对路径导入上一层目录的package并不被推荐,因为这违反了Go的模块化和包管理原则。Go鼓励使用工作区(workspace)和模块(module)来组织代码,并通过go mod工具进行依赖管理。

然而,如果你确实需要在特定情况下这样做(比如在一个临时项目中),你可以通过调整你的工作目录结构或使用Go的replace指令在go.mod文件中来实现类似的效果,但这通常不是最佳实践。

更标准的方法是:

  1. 重构代码:将需要共享的代码移动到一个公共的包中,这个包可以位于你的项目的根目录或者一个专门的internal目录中。

  2. 使用模块:确保你的项目是一个Go模块(即包含go.mod文件),并正确设置模块的路径。然后,你可以在项目的其他部分通过模块路径来导入这个包。

  3. 环境变量:虽然不常用,但你也可以通过设置GOPATHGOMODULE环境变量来影响Go的编译和构建过程,但这通常用于特殊场景或解决兼容性问题。

总的来说,遵循Go的模块化设计原则,使用工作区和模块来管理依赖,是处理这类问题的最佳方式。这样做不仅能提高代码的可维护性,还能更好地利用Go的工具链和社区资源。

回到顶部