从零开始学习 Go Web 开发
大家好,我是 Sam Zhang。
今天我想探索一下后端开发领域——所以我选择了 Go。我选择 Go 而不是其他语言(比如 Java)的主要原因是 Go 是一种比较新的语言(至少在我看来是这样)。
遗憾的是,我之前完全没有 Go 开发经验。所以我开始写这一系列博客,以便跟踪自己的进度。我会尝试“记录”我所做的事情,并在文章中写下一些主要概念。
当然,因为我还是个 Go 初学者(或者说新手?),所以这里可能有一些不正确的地方。如果有的话,请给我留言,帮助我改进!
那我们就開始吧!
安装 Go
与许多其他语言不同,安装 Go 非常简单,至少对我来说是这样。
继续在Go 下载页面下载官方安装程序。运行它,然后一切就绪!
Go 默认自带命令行工具go
。它包含一系列命令,例如run
、get
、mod
等等。当然,我会在本系列文章中多次使用这些命令。完整的命令列表请点击此处。
安装 Gin
我 Google 了一下哪个 Go Web 框架最适合初学者,但结果并没有什么帮助。不过,很多人提到了Gin ,它在GitHub上已经有近 6 万颗星。所以我选择了 Gin 作为我的入门框架。
创建一个新文件夹来包含您的项目并按照安装说明进行操作。
故障排除
如果您和我一样是个初学者,那么在运行时您可能会遇到以下问题go get
:
$ go get -u github.com/gin-gonic/gin
go: go.mod file not found in current directory or any parent directory.
'go get' is no longer supported outside a module.
To build and install a command, use 'go install' with a version,
like 'go install example.com/cmd@latest'
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.
这意味着您当前文件夹中没有创建模块。go mod
是一个用于管理 Go 模块的命令。我们将使用go mod init
该命令来生成一个新模块。
该go mod init
命令接受一个参数module-path。我现在不太确定这个参数的含义,我将其理解为模块的名称。module-path的格式应如下:
lorem/ipsum/dor
然后运行go mod init <module-path>
,并将 替换<module-path>
为你自己的模块路径。之后,你应该能够gin-gonic
正确安装。
编写第一个 Gin 请求
现在我们已经设置好了环境。让我们用 Go 编写一个简单的“Hello World”请求。
在根文件夹下新建一个文件,命名为,main.go
并填写如下代码:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default() // router with default middleware installed
// index route
router.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello World",
})
})
// run the server
router.Run()
}
然后运行go run main.go
并打开http://localhost:8080。希望能够正常显示 Hello World:
{
"message": "Hello World"
}
理解 Hello World 代码
那么……这到底是怎么回事?我们来看看代码。
我们已经声明了包main
,并导入了一些有用的包到代码中。我会尽力逐行解释main()
函数中的代码。
因此,在第 10 行,我们声明了一个名为 的变量router
。gin.Default
它返回一个附加了默认中间件(例如 Logger 和 Recovery 中间件)的路由器。你可能会好奇, 到底是什么:=
?其实,它和其他编程语言中的类似=
。在 Golang 中,=
表示赋值,表示声明赋值:=
。例如:
var router = gin.Default()
相当于:
router := gin.Default()
该:=
运算符称为“短变量声明”。更多信息请参阅此 StackOverflow 问题。
在第 12 到 16 行,我们定义了一个 GET 请求,映射到 ,/
并返回 JSON 响应。router.GET()
当然, 定义了一个 GET 请求。它的第二个参数接受一个可调用函数,而该函数将接收一个类型为 的参数gin.Context
。
在这种情况下,上下文变量名为c
。*gin.Context
它是指向值的指针gin.Context
。Gin 中的上下文提供了许多功能,例如中间件和响应。对于中文读者,您可以阅读这篇文章,以更深入地了解gin.Context
。
在第 13 行,我们调用c.JSON()
来响应此请求,其内容的 MIME 类型为application/json
。http.StatusOK
是 HTTP 状态代码的常量变量200 success
,来自内置包net/http
。
gin.H
是定义 JSON 数据类型的简化版本。如果你想在 JSON 对象中嵌套 JSON 对象,可以这样写:
gin.H{
"some-data": gin.H{
"message": "success"
}
}
最后在第 18 行,我们在默认端口 8080 上运行服务器。
实时重新加载
现在,如果您想更改 Go 应用程序的内容,则需要在每次更改内容时重新启动开发服务器,以便测试新添加的代码。
一些 Web 框架(例如 Python Flask)为开发服务器内置了热重载器。遗憾的是,Gin 没有内置此功能。我选择使用air作为自动重载器,当然你也可以使用其他框架。
设置 Air 非常简单。运行以下命令即可安装:
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
这会将 Air 安装到你的$GOPATH
,默认是。然后通过在你的(或)中添加以下行将~/go
其附加到你的:$PATH
.bashrc
.zshrc
export PATH=$PATH:$(go env GOPATH)/bin
...一切就绪!运行air init
即可生成默认 Air 配置。
使用 Air 更加简单。只需air
在命令行中运行,Air 就会main.go
在当前文件夹中运行,并自动监视源代码中的更改。
给 macOS 用户的提示:如果您不想在 Air 每次重新加载代码时看到烦人的弹出窗口,只需替换
router.Run()
和
router.Run("localhost:8080")
结论
所以……我终于完成了 Gin 的 hello world!我把所有源代码都放到了GitHub上,希望以后能更新。如果你觉得有用,或者只是想试试,可以 Clone 一下!
我是 Sam Zhang,下次再见!
文章来源:https://dev.to/samzhangjy/learning-go-web-development-from-zero-a1l