当前位置: 首页 > 科技观察

你想在你的项目中使用Go吗?我是这样想的

时间:2023-03-12 20:07:02 科技观察

最近决定在一个新项目中使用GoLang实现一套CRUDAPI。在此之前,我比较熟悉Java、Groovy,也了解一些Python。我的大部分经验是使用Java或Groovy加上SpringBoot。这对我来说有点无聊,那么为什么不来学习一些东西并找点乐子呢?要求以下是一些要求。设计实现领域数据模型,实现增删改查API。后端使用Mongo数据库必须要有Swagger文档API定义,并且可以轻松生成多种语言。客户端运行在Docker容器中,可以部署在Kubernetes中。非功能性需求需要可以轻松调用其他语言的API需要可以快速迭代(可能开箱即用)必须有单元测试奖金保守的内存消耗当我想在内存受限的环境中运行时这很棒(比如512MB内存的RaspberryPi)在运行程序时非常重要。既有趣又有学习经验使用模块和库使用模块访问数据库mongo-go-driverroutinggo-chiRESTAPIJSONPatch(译者注:RFC6902[1]和RFC7396[2])json-patch单元测试定义go-swagger的优点TheGo语言与C和Java非常相似。有了C和Java的基础,掌握Go语言,完成一个入门项目就轻而易举了。我特别喜欢Go代码的简单和清晰。公平地说,我也喜欢尽可能少样板的广受好评的框架。我真的很喜欢Java11+或Groovy与SpringBoot、SpringData、ProjectLombok以及可能的SpringDataREST结合使用。当然,有时SpringBootDataREST的魔力可能有点过头了。Go的“defer”关键字可以说是我最喜欢的功能之一。将某些操作推迟到函数退出的功能对于关闭资源和记录函数退出操作很有用。差异和不匹配错误处理有点麻烦。对于具有Java背景的人来说,错误处理有点不同。我发现在Go中它需要更明确。在Java中,一个方法可以抛出一个异常,捕获一个或多个异常,忽略它们(可能是错误的),或者重新抛出它们以供调用者处理。Go需要使用先调用方法再检查是否有错误的模式。我们可以讨论这是否是个好主意。我发现Go的错误检测和传播需要一段时间才能习惯,并且发现它有点繁琐,但它确实有效。//我经常在代码中看到这样的模式doSomethingElse(otherArg)iferr2!=nil{log.Println("WidgetdoSomethingElsereturnedererror:",err2)return}//...JSON响应类型和映射到结构对于Go,JSON和静态类型,我发现了Go如何处理动态JSON并将其解析为结构是笨拙且令人困惑的。这在Groovy和Python中相当容易,它们可以动态地将JSON转换为其他事物的映射。在Go中,将JSON反序列化为结构并将其序列化回与在其他语言中完成的方式没有根本区别。MaturityProgression在这方面我真的没有发现任何不好的地方。相反,我找到了值得期待的东西。因为Go仍然是一种相对较新的语言,它在某些领域正在迎头赶上。Go依赖项和版本化模块库之前使用过依赖项管理和构建工具,例如Java的Gradle和Maven,我自然希望Go具有相同级别的依赖项管理。在撰写本文时,GoLang1.13[3]支持Google的模块代理,文档是这样说的:从Go1.13开始,go命令将默认使用Google运行的Go模块镜像、Go校验和和数据库来下载和验证模块。有关这些服务的隐私信息,请参阅https://proxy.golang.org/privac[4],有关如何停止使用这些服务或使用其他服务的详细配置,请参阅命令文档[5]。如果依赖非公开的模块,请查看环境配置文档[6]结论令人惊讶的是,将GoLang掌握到实际生产水平是很容易的。我觉得它很有趣。增强RESTAPI、改进数据模型、生成Swagger文档和创建单元测试都是流行且舒适的体验。基于这次经历,我越来越想学习GoLang。