舍近求远,为什么 Golang 要这样读取本地的 package?

简介: 舍近求远,为什么 Golang 要这样读取本地的 package?

我们知道,Python 的第三方库一般是托管到 Pypi 上面的,使用 pip 命令进行安装。而 Golang 很多第三方库是托管在 Github 上面的,使用 go get 进行安装。


有时候,我们会发现一个很奇怪的现象,很多 Golang 的项目,在引用自己项目里面的包的时候,竟然用的是 Github 上面的地址。


例如我们看这个项目:https://github.com/kingname/handsome ,它的入口文件是main.go。我们打开这个文件,会看到里面import语句中,从 Github导入自身的util包:


640.png


可问题是,这个 util文件夹就在main.go旁边啊:


640 (1).png


如果是在 Python 里面,入口文件main.py旁边有一个util文件夹,这个文件夹里面有一个util.py的文件,那么我们直接写from util.util import xxx就可以导入util.py文件中的函数了。为什么 Golang 里面要从 Github 导入?那如果我更新了util/util.go文件里面的内容,但是我没有把这次修改上传到 Github 中,当我运行go run main.go的时候,运行的是老代码还是新代码?用的是我本地的版本还是 Github 上面的版本?


这个问题的关键,就在go.mod这个文件中。打开请看这个文件的第一行:


640 (2).png


可以看到,这个项目是使用 go mod 进行管理的,并且指定这个模块的名字,就叫做github.com/kingname/handsome


所以,当我们执行命令go run main.go的时候,Golang 的编译器知道自己就是github.com/kingname/handsome,那么main.go里面导入

github.com/kingname/handsome/util,实际上就是本项目自身根目录的 util文件夹中的包,它不会发起网络请求,不会从 Github 上面重新下载。每次运行的时候,使用的总是项目util/util.go中的内容。


但是,如果你现在在另外一个项目里面导入github.com/kingname/handsome/util,Golang 从go.mod中知道当前运行的项目跟即将导入的这个包不在同一个项目中,于是它就会去 Github 上面拉代码下来运行。


这个规则,可以在 Golang 的官方文档Module paths这一节找到:Go Modules Reference - The Go Programming Language[1]


参考文献


[1] Go Modules Reference - The Go Programming Language: https://go.dev/ref/mod#introduction


请关注微信公众号【未闻Code】获取更多精彩文章。


目录
相关文章
|
6月前
|
监控 安全 Go
Golang 语言中 Context 的使用方式
Golang 语言中 Context 的使用方式
23 0
|
8月前
|
存储 安全 测试技术
Golang Context 详细原理和使用技巧
Golang Context 详细原理和使用技巧
|
9月前
|
Go
golang中_的作用没你想的那么简单
golang中_的作用没你想的那么简单
|
10月前
|
监控 安全 Go
Golang 中 context 的使用方式(一)
Golang 中 context 的使用方式(一)
78 0
|
10月前
|
监控 安全 Go
Golang 中 context 的使用方式(二)
Golang 中 context 的使用方式(二)
77 0
|
存储 安全 Go
Golang 同步原语:sync 包
资源竞争:多个goroutine同时竞争同一块内存时,就无法知晓谁先访问,结果也无法预料。 所以,我们需要确保共享内存资源,只有一个协程执行能够操作。
120 0
|
Go
Golang 中 Context 的理解
我以前对Context的理解,就是从字面上理解:上下文,一个请求链路中一直存在的某信息。打个比方,Client请求A-Service到B-Service,B-Service再到C-Service,在这个请求链路中,上游就会将内容传递给下游,A-->B,B--->C是保持一个请求过程的。Context是程序单元的一个运行状态、现场、快照。结合这句话,我对Context的理解是Context用于保证一个Request在同一个生命周期内。 在Go语言中,程序单元指的就是Goroutine。 所以,一个Request,可能会在多个goroutine中去处理,多个goroutine可能共享Reque
72 0
|
Java Linux Go
知识分享之Golang——基于Golang的文件夹是否存在、文件是否存在函数
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
108 0
知识分享之Golang——基于Golang的文件夹是否存在、文件是否存在函数
|
程序员 Go API
golang实战之flag包
开发命令行程序时,经常需要接受命令行传入的参数,flag包提供了参数处理的功能,本文通过demo列出了常用API的用法
141 0
golang实战之flag包
|
存储 安全 Java
Golang之context
周末的快乐时光总是很短暂。 今天天气不错,有点太阳。去附近的商场吃了一顿“高老九重庆火锅”,味道还行,主要是好久没吃火锅了~ 白天把家里好好收拾了一下,感觉心情也跟着变好了。
219 0