主要分为两种情况:一种是在同一个项目下导入,一种是两个不同项目
我的gopath路径在D:gowork
同一个项目导入
这种情况是不需要改动go.mod文件的
文件结构如下,firsttest目录下一个main.go文件,外加当前文件夹下面的InvokeDir文件夹,文件下面有个invoke.go文件,作为测试用的调用函数
1.go.mod文件,注意module名字为firsttest,这个名字就是module名字
main.go文件内容,可以看到直接用module名字加相对路径文件夹即可。即firsttest/InvokeDir
InvokeDir文件内容,注意函数要大写暴露出来给main.go调用
2. 为了表现go.mod文件module名字作用,我们把它改为
这时候发现标红,无法识别
必须改成module 名字+当前文件夹的相对路径才可以
3.为了体现go mod和传统gopath的区别,我们把gomodule关闭看看。
我用的是goland,所以需要把这个Enable对勾取消,表现如下,此时就用我们传统的gopath路径。
看又标红了
而且由于我们路径选择的是D:gowork(gomod可以任意目录),而不是D:gowork/src,我们文件夹下的InvokeDir这个包根本无法调用,如果要调用怎么办呢,如下:
把文件都丢到src下面,此时就可以用传统gopath方式调用了,应该注意到这是因为新的Invoke文件夹因为在src下,才能识别到。
应该注意到,我们gomod用的调用文件夹在D:gowork/firsttest/invokeDir
而传统gopath调用文件夹在D:gowork/src/firsttest/invoke
注意加粗区别,那么我们能不能在gomod目录下非要调用AddNumber函数呢,因为这相当于涉及一个非当前项目调用的问题,只不过在传统gopath导入包模式下。(目前go module已经关闭,保持传统gopath方式)
答案就是可以,我们直接把src下这个函数的路径写下来就行,即使此时我们在D:gowork目录下
- 调用当前项目下的其他包,用module名+相对路径即可。
- 调用非当前项目的其他本地包,需要修改go.mod文件,包的导入路径从go.mod文件里参照。
gomod调用不同项目的本地包
打开goland的go module模式
发现我们在gomod又不行了,之前我们用传统模式是可以直接调用src下面的Invoke包的。
这里面就涉及一个非当前项目,如何调用本地包的问题,我们就拿这个例子来改动,看如何用gomod来调用。
1. 在被调用的包下面,使用gomodule功能,把该被调用包变成一个module, go mod init firsttest
2. 在我们自己项目的go mod下增加如下配置: 解释下,require 就是我们要引用的包名,名字随便起,和import导入时对应就好(建议名字跟本地其他包的module名相同),replace是关键,用这种格式,将src的包转换成我们导入的包名。=>这里我填的是绝对路径,也可以用相对路径。
3. 我们再看看是不是正常了,这就实现了传统gopath的导入,但我们此时还是gomod模式,好处就是我们可以不拘泥于src下创建项目,非常适合linux环境的开发。
比如
改为
把导入名字也改成hello,居然也可以!
此时的hello可以看作一个变量,变量就是你自己随便取的名字,只要replace =>后面指向的绝对路径是我们想要导入的包就可以啦,所以你就可以把包名改成github.com这种标准名字,是不是很有意思。



