开始踩坑GoWeb

这是我第一次使用 GoLang 进行 Web 开发,以前用的是 Koa 和 ThinkPHP 进行 Web 后端的开发,也算是有一些经验吧,这篇文章用来记录开发第一个小时遇到的问题。

如果你是GoLang的初学者,并且使用的第一个外部包是 iris ,那么这篇文章对你相当有帮助。

问:开发前一个小时我们在做什么?
答:打造开发环境和 initialize。

开发环境

开发环境倒是不用配置,这个在安装 GoLang 的时候就配置好了,只需要提一点就行了,后面会提到。

关于GOPATH

它指定软件包源代码所在的目录,$GOPATH 默认采用和 $GOROOT(GO 的安装目录) 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src、pkg 和 bin,这三个目录分别用于存放源码文件、包文件和可执行文件。

初始化项目

我使用的是iris,这个 Web 框架,选择这个框架的原因主要参考了Awesome Web Frameworks for Gophers这篇文章,毫无疑问,我认为这将是未来几年最具潜力的框架,在开源 GoWeb 框架中性能是最强的,社区也是最活跃的,学习曲线相对容易。

安装

按照官方文档首先使用go-get从 GitHub 上将外部包下载到本地,但在国内的话一般是不成功的。

PowerShell
1
go get github.com/kataras/iris/v12@latest

所以我通过百度找到了热心网友,网友的帖子上说需要先设置GO111MODULE这个环境变量为on,然后设置代理(为了避免从 GitHub 下载源码网速慢而下载失败),根据你的操作系统执行下面两条命令:

MacOS/Linux bash
1
2
3
4
5
# Enable the go modules feature
export GO111MODULE=on

# Set the GOPROXY environment variable
export GOPROXY=https://goproxy.io
Windows PowerShell
1
2
3
4
5
# Enable the go modules feature
$env:GO111MODULE="on"

# Set the GOPROXY environment variable
$env:GOPROXY="https://goproxy.io"

现在我们写入一段示例代码来测试一下:

GoProjectDir/main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"github.com/kataras/iris"
)

func main() {
app := iris.New()
app.Handle("GET", "/welcome", func(ctx iris.Context) {
ctx.HTML("<h1>Welcome</h1>")
})
app.Run(iris.Addr(":8080")) //8080 监听端口
}

这时候 Goland 报错了,告诉我们无法找到引用的包。

问题在哪?

这时候我们会很自然的去看这个包是不是真的下载到本地了,于是我们上去GOPATH目录去找,发现目录下只有pkg文件夹,而没有src源文件文件夹。

output
1
2
3
4
5
6
7
8
PS F:\ProjectFiles\Go> cd $env:gopath
PS E:\Application\GOPATH> ls

Directory: E:\Application\GOPATH

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2020/5/28 21:35 pkg

产生原因

正常情况下,引入一个外部包时会在GOPATH下的src目录进行包的查找,很明显没有这个文件夹是导致错误的直接原因。

为什么会这样呢?

你可能已经注意到我们之前设置了一个环境变量GO111MODULE=on,安装包的时候默认采用是 GOPATH 的模式(GO 最初的依赖管理系统),就是把包的源码放进src目录,而当我们设置了上面这个环境变量的时候就会使用 GoMod 模式,它使用 Go Module 的方式管理包,可以理解为 Module 是 Go packages 的集合。

如何解决

使用了不同的依赖管理系统就要用不同的方式,如果你用过 Node 就很好理解,每个 Node 项目都会有一个package.json,里边描述了项目和依赖的信息。对于 GoMod 而言,每一个 Go 项目需要一个go.mod文件来描述这些信息。接着上面的操作,创建一个go.mod文件:

PowerShell
1
go mod init `你的包名,通常是项目名称`

初始化之后里面还没有依赖,在项目文件夹重新使用go-get安装一下包,因为GOPATH已经有了,所以这次直接建立了引用而不需要下载了。现在重新 run 一下,已经没有问题了。

如果你的 GoLand 仍然提示有错误,在设置中的 GOPATH 配置添加上面设置的环境变量即可。

经验总结

  1. 不要随便复制别人的操作,比如说如果没有设置GO111MODULE=on,只设置代理,那么后面的问题都不会出现。
  2. 但是还是推荐使用 GoMod 这种依赖管理方式,因为你可以对项目的依赖轻松进行删除,升级,添加等操作。
  3. 之所以出现这个问题,另外一个原因是,GoMod 是在 2018 年提出使用的,我看的中文文档版本太老压根没有提到,初来乍到,没有关注行情。

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×