不懂就问:Golang Go语言的导包规则

不懂就问:Golang Go语言的导包规则

因为对 Java 比较熟悉,所以产生了这个疑问:

为什么我看到很多开源项目里的代码,同一个项目内的包引用都要 import github 的绝对路径,而不使用项目的根路径呢?

或者说使用项目根路径有什么弊端?

开发工具是 goland

20 回复

如果你想看懂 go,
为什么不花 30 分钟看个基础呢?
你光问一个 import 怎么用,你还是看不懂 go 的。

更多关于不懂就问:Golang Go语言的导包规则的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


用 github 路径可以支持 go get, 项目根路进不行, 有了 go mod 后,我自己的项目都用根路径了.

官方说不推荐相对路径,大家就养成习惯了呗。

注意这里的相对路径也不是相对于当前文件的,没用 go mod 是相对于 gopath,用了是相对于 mod 文件里声明的 package

因为 golang 没有中心仓库,package 都在互联网的各处,内网也没办法弄一个 mirror,所以基本没有内网写 golang 的需求。

和群里面讨论了一下,我的一点总结:
因为 go 是没有项目概念的,所有的代码都在 gopath/src 下可以相互引用,相当于 gopath/src 就是一个大项目,但是这样会很麻烦,项目会分不开,所有就有了 gomodule,把项目区分开,区分的方式就是以 go.mod 文件所在目录为项目根目录。

结论就是:用 go mod 之前,import 最好用绝对路径,而且是 github 开头的路径。用了 go mod 之后,路径随意了,因为有了包的概念。

java 不也是用的绝对路径,项目绝对路径不就保证所有代码不会冲突了吗

Java 又不会把所有包都存在一个目录( gopath )

java 是 classpath 下面,go 是 gopath 下面,因此本质是一样的

com.github.xx.yy 和 github.com/xx/yy 本质没区别

因为相对路径在更新项目后可能会失败,也可能机缘巧合的不失败。让错误早点发生就能早点解决。

另外不一定是 github 绝对路径,比如 b 站开源出现的 go-common 模块。

这点真的很坑,初入的都是懵逼

请使用 go mod

一般都是以 go 的 src 的相对路径吧 .

go mod吧,golang 官方出的依赖管理工具。

mlog.club/topic/9

同感吧,我第一次做的时候也是摸了很久。
基本上,我所在的 QQ 群,微信群,社区,每天(是每天!)都有这个问题出现,我已经被问的崩溃了,我把我的 github 笔记发出去无数次,无济于事,每天,甚至每小时都会有这个问题的讨论


友情提醒, 你的 github 连接里多了一个字母 i …

现问是不是,再问为什么。

这都看到了,感谢小哥哥…

在Go语言中,导包规则是编程时的基础且重要的部分,它们定义了如何组织和引用代码。以下是一些关键的导包规则:

  1. 导入路径:Go使用导入路径来定位包。这些路径通常是相对于GOPATH或GOROOT环境变量的相对路径,或者是从远程仓库(如GitHub)导入的模块路径。

  2. 导入声明:使用import关键字来导入包。如果包名在代码中需要被引用,可以直接使用其默认名称;如果希望使用别名,可以在导入时指定。

  3. 包别名:有时为了避免命名冲突或简化代码,可以为导入的包指定一个别名。例如,import f "fmt"允许你通过别名f来调用fmt包中的函数。

  4. 匿名导入:使用_作为别名进行导入时,表示只执行该包的init函数,但不打算在代码中使用该包的任何公开接口。这常用于导入那些仅提供初始化功能的包。

  5. 本地包与标准库:Go的标准库包(如fmtos等)可以直接通过其名称导入。而本地包则需要根据其在项目中的相对路径来导入。

  6. 循环依赖:Go不允许包之间存在循环依赖,这要求开发者在设计包结构时特别注意,以避免引入难以解决的依赖问题。

理解这些规则有助于编写清晰、模块化的Go代码。希望这能帮助你更好地掌握Go语言的导包机制!

回到顶部