上一篇我们用结构体描述请求与响应,也使用了 *bool 区分可选开关的不同状态。这一篇继续理解几个已经见过的写法:&req 为什么能让 JSON 解码器填入数据,*req.Notify 为什么要先判断是否为 nil,以及 *gin.Context 中的星号表示什么。
理解这些写法,需要先弄清楚变量的值、指向变量的指针,以及函数调用时发生的拷贝。下面继续用独立的学习示例观察这些行为,完整程序可以在 Go 1.24.13 下运行。
上一篇我们用结构体描述请求与响应,也使用了 *bool 区分可选开关的不同状态。这一篇继续理解几个已经见过的写法:&req 为什么能让 JSON 解码器填入数据,*req.Notify 为什么要先判断是否为 nil,以及 *gin.Context 中的星号表示什么。
理解这些写法,需要先弄清楚变量的值、指向变量的指针,以及函数调用时发生的拷贝。下面继续用独立的学习示例观察这些行为,完整程序可以在 Go 1.24.13 下运行。
上一篇我们通过 Gin 读取请求参数,并把 JSON 请求体绑定到 Go 结构体中。这一篇继续看看这个结构体:字段为什么通常以大写字母开头,json 标签如何决定接口字段名,以及缺少参数时字段会是什么值。
真实项目中的请求和响应模型经常包含嵌套结构体、列表和可选字段。理解这些写法后,再阅读项目中的 viewmodel,就能把 Go 类型和接口实际收发的数据对应起来。本文示例使用 Go 1.24.13 的 encoding/json 标准库。
上一篇我们认识了 Go 项目的入口、目录结构和路由注册。接下来挑一条 HTTP 请求,看看 Gin 如何把请求交给处理函数,以及处理函数怎样读取参数、返回响应。
我们先从项目里比较简单的健康检查路由观察 Controller 与业务逻辑的调用关系,再用一个独立的小例子学习 gin.Context、参数绑定和 JSON 响应。示例中的路径和数据都是为了学习而编写,不包含真实项目的接口信息。
上一篇我们创建了第一个 Go 程序,并用 Gin 注册了一个 HTTP 接口。接下来不急着继续增加接口,先学会读一个已有的 Go 项目:程序从哪里启动、路由在哪里注册、一次请求又是怎样进入业务代码的。
下面以真实项目中常见的 Go + Gin 结构为例,隐去项目名称和业务信息,只关注 Go 语言和项目组织方式。
GoLand 是 JetBrains 出品的 Go 语言 IDE,功能强大但需要付费订阅。本文记录在 Mac 上通过 jetbra 破解 GoLand 的完整流程,以及破解后遇到 We could not validate your license 弹窗的解决办法。
本文记录一次 macOS Apple Silicon 环境下 Go 程序构建和启动失败的排查过程。排查过程中先后遇到可执行文件签名异常,以及升级 Go 后的链接错误。最终将本机 Go 版本切换到 1.24.13 后,程序可以正常运行。
之前我们利用 python 的网络库模拟浏览器的请求,需要额外设置如 user-agent 的请求头,那么我们可不可以只负责写代码,让它自己打开浏览器自己去请求网站呢?
答案是肯定的,selenium 应运而生。
selenium 是一个自动化测试工具,支持各种主流浏览器。只有 selenium 还不够,我们还需要下载浏览器驱动。
利用正则表达式提取信息太麻烦了,所有就有了 BeautifulSoup。BeautifulSoup 是一个搞笑的网页解析库,是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。