【GoLang】不在GOROOT目录的情况下,如何让不同的go文件之间可以调用自定义的函数

条件

当执行文件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
在这里插入图片描述
把我名为SortAlgorithmpackage扔进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名为SortAlgorithmpackage删掉

先在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 SortAlgorithmpackage 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的博客方法,但是我怎么可能满足用这种垃圾方法,所以我就继续找,但是绝大多数都是大失所望(找到了相关文章,但是都基本重复

也有的是让你去改GOROOTGOPATH变量,但是这些方法只会暂时起作用,而且也麻烦,我就没写进去。

后面我在B站学习偶然就找到别人教的go mod init方法,发现原来还可以这样用。

而同级目录和跨包情况则是看到了这篇博客(其实没解释清自己的环境和具体操作,最终也就无法复现结果):

GO语言包之间的调用

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值