干巴巴的理论
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 install
或go 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
7package mysql
import "fmt"
func Connect_mysql() {
fmt.Print("你已成功连接到数据库!!");
}
然后在桌面搞一个call.go
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import (
"fmt"
"test"
"test/mysql"
)
func main() {
fmt.Printf("测试一下调用GOPATH的效果")
fmt.Println()
test.Call_Hello()
mysql.Connect_mysql()
fmt.Println()
}
从这个例子我们可以看出:
1 | 1.当执行golang程序,需要获取import的包时,编译器回先去GOROOT路径下的src文件夹找有没有我们在程序中import的包 |
所以只要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