Go 中的计算器后端 API
再次回来另一个迷你项目,这次是用 Go 编写的计算器后端 API 工具!
我最近完成了一个为无状态计算器构建 HTTP JSON API 的项目,让我告诉你——它比我预期的有趣得多(也更具挑战性)。从表面上看,这可能听起来很简单:“嘿,这只是一个计算器,对吧?”但一旦你深入研究,你就会开始发现使 API 真正适合生产的所有细节。
所以,让我分享一下这个过程、吸取的教训,以及如果我必须再做一次的话我会调整什么。
~ 源代码:在这里找到
无状态计算器 API
任务很简单:为不存储任何数据的计算器构建一个 API——没有数据库,没有内存缓存。每个计算都是孤立发生的。无国籍。干净的。简单的。该 API 遵循 OpenAPI 规范,该规范列出了所有端点和预期行为。
接下来怎么办?
输入验证
我学到的第一个教训就是输入验证的重要性。你不能信任用户,即使是像数学这样基本的东西。例如:
如果有人发送非号码会怎样?繁荣。
除以零怎么样?双重繁荣。
为了解决这个问题,我确保在 API 考虑处理每个输入之前都对其进行了清理和验证。如果出现问题,用户会收到一条有用且友好的错误消息,例如:
{ "error": "Division by zero is not allowed. Please provide a valid denominator." }
没有人喜欢神秘的“500 服务器错误”消息。
调试日志
你知道这句话吗?“原木是你最好的朋友”?这是真的。我使用 Go golang.org/x/exp/slog 包实现了结构化日志记录,它节省了我很多时间。每个请求都记录有详细信息,例如:
- 请求路径
- 用户的IP地址
- 状态代码
- 出现的任何错误
这是我如何设置文本日志的片段:
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
或者 JSON 日志(非常适合与监控工具集成):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
当某些事情没有按预期工作时,拥有这些日志可以让调试变得轻而易举。
CORS:意想不到的英雄
我最初并没有计划在基于浏览器的应用程序中使用这个 API,但随着项目的发展,很明显 CORS(跨源资源共享)是必要的。
使用 github.com/rs/cors 包,我快速添加了所需的标头,以允许基于浏览器的客户端与 API 交互。
{ "error": "Division by zero is not allowed. Please provide a valid denominator." }
我的主要包
1) net/http:Go 的标准库,用于设置 HTTP 服务器和路由请求。
2)encoding/json:处理请求和响应的JSON编码/解码。
3) golang.org/x/exp/slog:用于以文本或 JSON 格式记录每个请求。
4) github.com/rs/cors:处理 Web 集成的跨域请求。
计算逻辑又如何呢?
我为这些计算制作了一些处理程序,它们本质上非常基本,主要关注计算的核心功能(加法、减法、除法和乘法)。
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
除此之外,使用著名的 net/http 包处理我的 HTTP 请求非常简单,并且有许多以不同方式执行此操作的示例。我的情况非常简单,我只需要提供一些 HTTP,处理响应编写器和请求。
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
以下是一些用例示例:
c := cors.New(cors.Options{ AllowedOrigins: []string{"*"}, AllowedMethods: []string{"GET", "POST", "OPTIONS"}, AllowedHeaders: []string{"Content-Type"}, AllowCredentials: true, })
请求:
//handlers.go func AddHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a + b }) } } func SubtractHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a - b }) } } func MultiplyHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a * b }) } } func DivideHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { if b == 0 { panic("division by zero") } return a / b }) } }
结论
是的!差不多就这样了!这是一个我喜欢的快速而有趣的迷你项目!请随意尝试并以您想要的方式改进和增强。
下次再见,干杯! ? ?
以上是Go 中的计算器后端 API的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t
