如何理解GOPATH

干巴巴的理论

Golang劝退一般有几个地方,第一个地方就是GOROOT/GOPATH的配置,第二个就是指针,第三个就是数组。这里先说第一个,它是基础中的基础。这里的配置操作系统是Windows,IDE是VsCode,GO版本是1.17.3

一般来说,有些“零基础教程”会让你在安装好golang之后,默认把go的安装路径放在C:\go里,然后让你做如下的配置:

那么如果你按照这样把GOPATH = %UserProfile%\gopath,那么当你打开VsCode的时候,就会提示你gotools插件都会安装到这里:

如果VScode安装tools反馈permission denied,如图:

那么需要sudo chmod -R 777 /usr/local/go/bin给一下权限。

可见GOROOT就是Go的安装路径,主要是为了防止你的电脑里有多个GO版本,这样当你go run or go build的时候,能正确找到对应的那个可执行文件go。而GOPATH就是一个环境变量,是你workspace的根目录。所以说写GO的人不要轻易在其他人的电脑上另起炉灶,另起炉灶就要重新配置玩这意。这个的好处是对开发人员的一个管理,不要随意新开目录。在GOPATH指定的工作目录下,代码总是会保存在$GOPATH/src目录下。在工程经过go build、go installgo get等指令后,会将产生的二进制可执行文件放在 $GOPATH/bin目录下,生成的中间缓存文件会被保存在$GOPATH/pkg下。

但是要知道GO自带的包都是很基础的,如果我们要获取远程第三方包,就要用go get下载,那么当你去go get的时候,其实对应的代码是被下载到$GOPATH/src/里的,如图:

这里要注意一点,就是当import包时,会优先在GOROOT里进行查找,import导入后的包,是基于GOPATH进行创建的。当然,如果你想一镜到底,写一个脚本,那可以不设置GOPATH。直接package main,func main确认脚本入口就开始一把梭。

举个例子

我们现实中肯定一个.go文件就能全搞定的事儿少之又少,那么难免就要多个文件联合起来,以一个文件作为main总入口,这个“入口文件”里面会import多个其他文件,来达到效果。这里有个面试知识点:main函数跟init函数一样,是没有参数和返回值的。

举一个例子,比如我们有一个go文件,它是链接数据库的文件。首先我们在$GOPATH/src/下创建一个test,然后先创建一个叫print_hello.go的文件内容如下:

1
2
3
4
5
6
7
8
package test

import "fmt"

func Call_Hello() {
fmt.Print("我要玩英灵殿啊啊啊!!");
fmt.Println()
}

然后在test文件夹下再创建一个mysql的文件夹,里面创建一个con_mysql.go:

1
2
3
4
5
6
7
package mysql

import "fmt"

func Connect_mysql() {
fmt.Print("你已成功连接到数据库!!");
}

然后在桌面搞一个call.go:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"test"
"test/mysql"
)

func main() {
fmt.Printf("测试一下调用GOPATH的效果")
fmt.Println()
test.Call_Hello()
mysql.Connect_mysql()
fmt.Println()
}

从这个例子我们可以看出:

1
2
1.当执行golang程序,需要获取import的包时,编译器回先去GOROOT路径下的src文件夹找有没有我们在程序中import的包
2.如果在GOROOT下没有找到,就会去GOPATH下src下找这个包

所以只要GOROOT跟GOPATH下都没找到包的话就会报错,如果明明在$GOPATH/src/XXX下有对应的目录,但是报“package ‘xxx’ is not in GOROOT”,那么使用export GO111MODULE=off,因为gopath模式引入包从src目录下开始引入,这里需要需要关闭go mod模式。

但是要注意export GO111MODULE=off,这个是对于单独终端窗口而言的,而不是对全局而言的,所以Vscode的Run Code会提示失败,但是在终端里使用go run XXX.go是OK的。

参考资料

https://www.jianshu.com/p/a244f48f49b3
https://www.cnblogs.com/wuhaidong/articles/10405960.html
https://sysin.org/blog/go-vs-code/#0-%E7%B3%BB%E7%BB%9F%E5%87%86%E5%A4%87-1
https://www.jianshu.com/p/82b55b516cc8
https://www.jianshu.com/p/a244f48f49b3

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------