条件
当执行文件main.go想要调用其他文件的函数,但是该文件选择不在GOROOT\src目录的情况下,如何实现下面的操作
目标
目标一:实现跨包情况下,两个不同文件之间的函数调用
目标二:实现在同一级目录下,不同文件之间的函数调用
实现目标一
实现main.go文件可以调用自定义package下的所写的函数
目录结构

被导文件bubbleSort.go
package SortAlgorithm
// 注意必须要令函数的开头大写,才能表示公开使用
func BubbleSort(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
for j := 0; j < length-1-i; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return arr
}
解决方案
方案一:把自定义的package移到GOROOT目录下
- 优点:你用VSCode不再遇到犯人的报错提示,不用在意main.go在哪个位置
- 缺点:有一天你忘记了
goroot里面哪个package是你之前弄的
输入命令go env或者自己看电脑的环境变量设置就找到你定义的GOROOT

把我名为SortAlgorithm的package扔进D:\Go\src中即可

另外函数调用要符合图中的红框的规则
包名.函数名称(首字母大写)
import从src目录开始,比如我加多一层目录和相应的go文件函数想调用SortAlgorithm\BubbleSort\BubbleSort1.go,import也要相应的改变import "SortAlgorithm/BubbleSort"
在VSCode用code runner插件执行文件(懒人能不写执行命令就不写)

方案二:通过go mod init命令
- 优点:脱离了必须放到
GOROOT的麻烦 - 缺点:如果你的执行文件放在
GOROOT目录下,VSCode的GO插件会贴心地提示报错,但是依旧可以运行
把之前放入GOROOT名为SortAlgorithm的package删掉
先在VSCode的终端执行命令go mod init 任意名称(我这里写sa),之后就会自动生成go.mod文件了。

go.mod
module sa
go 1.18
注意:
如果你后悔起了一个名字,想重新写一个新的,那么就需要删掉go.mod文件,再重新执行命令
最终执行文件main.go
package main
import (
"fmt"
//最终要按照mod的任意名称在你的package前加上即可
"sa/SortAlgorithm"
)
func main() {
arr := []int{10, 2, 5, 6, 9}
fmt.Println(SortAlgorithm.BubbleSort(arr))
}
实现目标二
目录结构
这次我把main.go文件放入到SortAlgorithm目录下

方案一:命令方法
后面我就发现code runner插件并没有多智能,移动到对应的终端去执行命令,参考这篇文章golang同级目录下不同文件调用函数
命令一:
go run main.go bubbleSort.go
注意:
- 要先修改
bubbleSort.go文件中开头的package SortAlgorithm为package main

命令二:
go run .
注意:
- 所有同一个package下的go文件得是
package main,不然系统会提示说有多个package不知道你想执行哪个。 - 这个package必须要放到GOROOT目录下也即
D:\Go\src(我的go环境是这样的,各位看自己的)下

碰壁历程(可以不看)
一开始看了其他人的博客,使用的是相对路径来导包(一定是让执行的main.go文件不在GOROOR\src才会发生),结果尴尬地发现新版本的go不允许这样干:
path is relative, but relative import paths are not supported in module mode
后面就找到了放入到GOROOT的博客方法,但是我怎么可能满足用这种垃圾方法,所以我就继续找,但是绝大多数都是大失所望(找到了相关文章,但是都基本重复)
也有的是让你去改GOROOT和GOPATH变量,但是这些方法只会暂时起作用,而且也麻烦,我就没写进去。
后面我在B站学习偶然就找到别人教的go mod init方法,发现原来还可以这样用。
而同级目录和跨包情况则是看到了这篇博客(其实没解释清自己的环境和具体操作,最终也就无法复现结果):
8216

被折叠的 条评论
为什么被折叠?



