开始踩坑GoWeb
这是我第一次使用 GoLang 进行 Web 开发,以前用的是 Koa 和 ThinkPHP 进行 Web 后端的开发,也算是有一些经验吧,这篇文章用来记录开发第一个小时遇到的问题。
问:开发前一个小时我们在做什么?
答:打造开发环境和 initialize。
开发环境
开发环境倒是不用配置,这个在安装 GoLang 的时候就配置好了,只需要提一点就行了,后面会提到。
关于GOPATH
它指定软件包源代码所在的目录,$GOPATH
默认采用和 $GOROOT
(GO 的安装目录) 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src、pkg 和 bin,这三个目录分别用于存放源码文件、包文件和可执行文件。
初始化项目
我使用的是iris,这个 Web 框架,选择这个框架的原因主要参考了Awesome Web Frameworks for Gophers这篇文章,毫无疑问,我认为这将是未来几年最具潜力的框架,在开源 GoWeb 框架中性能是最强的,社区也是最活跃的,学习曲线相对容易。
安装
按照官方文档首先使用go-get
从 GitHub 上将外部包下载到本地,但在国内的话一般是不成功的。
1 | go get github.com/kataras/iris/v12@latest |
所以我通过百度找到了热心网友,网友的帖子上说需要先设置GO111MODULE
这个环境变量为on
,然后设置代理(为了避免从 GitHub 下载源码网速慢而下载失败),根据你的操作系统执行下面两条命令:
1 | # Enable the go modules feature |
1 | # Enable the go modules feature |
现在我们写入一段示例代码来测试一下:
1 | package main |
这时候 Goland 报错了,告诉我们无法找到引用的包。
问题在哪?
这时候我们会很自然的去看这个包是不是真的下载到本地了,于是我们上去GOPATH
目录去找,发现目录下只有pkg
文件夹,而没有src
源文件文件夹。
1 | PS F:\ProjectFiles\Go> cd $env:gopath |
产生原因
正常情况下,引入一个外部包时会在GOPATH
下的src
目录进行包的查找,很明显没有这个文件夹是导致错误的直接原因。
为什么会这样呢?
你可能已经注意到我们之前设置了一个环境变量GO111MODULE=on
,安装包的时候默认采用是 GOPATH 的模式(GO 最初的依赖管理系统),就是把包的源码放进src
目录,而当我们设置了上面这个环境变量的时候就会使用 GoMod 模式,它使用 Go Module 的方式管理包,可以理解为 Module 是 Go packages 的集合。
如何解决
使用了不同的依赖管理系统就要用不同的方式,如果你用过 Node 就很好理解,每个 Node 项目都会有一个package.json
,里边描述了项目和依赖的信息。对于 GoMod 而言,每一个 Go 项目需要一个go.mod
文件来描述这些信息。接着上面的操作,创建一个go.mod
文件:
1 | go mod init `你的包名,通常是项目名称` |
初始化之后里面还没有依赖,在项目文件夹重新使用go-get
安装一下包,因为GOPATH
已经有了,所以这次直接建立了引用而不需要下载了。现在重新 run 一下,已经没有问题了。
如果你的 GoLand 仍然提示有错误,在设置中的 GOPATH 配置添加上面设置的环境变量即可。
经验总结
- 不要随便复制别人的操作,比如说如果没有设置
GO111MODULE=on
,只设置代理,那么后面的问题都不会出现。 - 但是还是推荐使用 GoMod 这种依赖管理方式,因为你可以对项目的依赖轻松进行删除,升级,添加等操作。
- 之所以出现这个问题,另外一个原因是,GoMod 是在 2018 年提出使用的,我看的中文文档版本太老压根没有提到,初来乍到,没有关注行情。