【GoLang】如何让不同的go文件之间可以调用自定义的函数

目标

目标一:实现跨包情况下,两个不同文件之间的函数调用
目标二:实现在同一级目录下,不同文件之间的函数调用

实现目标一

实现main.go文件可以调用自定义package下的所写的函数

目录结构

【GoLang】如何让不同的go文件之间可以调用自定义的函数_第1张图片

被导文件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不再遇到犯人的报错提示
  • 缺点:有一天你忘记了goroot里面哪个package是你之前弄的

输入命令go env或者自己看电脑的环境变量设置就找到你定义的GOROOT
【GoLang】如何让不同的go文件之间可以调用自定义的函数_第2张图片
把我名为SortAlgorithmpackage扔进D:\Go\src中即可
【GoLang】如何让不同的go文件之间可以调用自定义的函数_第3张图片
另外函数调用要符合图中的红框的规则

包名.函数名称(首字母大写)

在VSCode用code runner插件执行文件(懒人能不写执行命令就不写

【GoLang】如何让不同的go文件之间可以调用自定义的函数_第4张图片

方案二:通过go mod init命令

  • 优点:脱离了必须放到GOROOT的麻烦
  • 缺点:如果你的执行文件放在GOROOT目录下,VSCode的GO插件会贴心地提示报错,但是依旧可以运行

把之前放入GOROOT名为SortAlgorithmpackage删掉

先在VSCode的终端执行命令go mod init 任意名称(我这里写sa),之后就会自动生成go.mod文件了。
【GoLang】如何让不同的go文件之间可以调用自定义的函数_第5张图片
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目录下
【GoLang】如何让不同的go文件之间可以调用自定义的函数_第6张图片

方案一:命令方法

后面我就发现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环境是这样的,各位看自己的)下

在这里插入图片描述

碰壁历程(可以不看)

一开始看了其他人的博客,使用的是相对路径来导包,结果尴尬地发现新版本的go不允许这样干:

path is relative, but relative import paths are not supported in module mode

后面就找到了放入到GOROOT的博客方法,但是我怎么可能满足用这种垃圾方法,所以我就继续找,但是绝大多数都是大失所望(找到了相关文章,但是都基本重复

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

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

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

GO语言包之间的调用

你可能感兴趣的:(菜鸟跟着大佬过河,golang,vscode,开发语言)