条件
当执行文件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
方法,发现原来还可以这样用。
而同级目录和跨包情况则是看到了这篇博客(其实没解释清自己的环境和具体操作,最终也就无法复现结果):