【Go语言中文网】Go?我是这么思考的,项目中要不要使用

更多Go资讯 , 欢迎微信公众号“Go语言中文网”关注我们 , 可领全套Go资料 , 每天学习Go语言
【Go语言中文网】Go?我是这么思考的,项目中要不要使用
文章图片
我最近决定在一个新项目中使用GoLang来实现一组增删改查的API 。 在此之前 , 我较为熟悉Java , Groovy , 了解一些Python 。
我大部分的经验都是使用Java或者Groovy加上SpringBoot 。 这让我感到有些无聊 , 所以为什么不来学点儿东西找找乐子呢?要求
以下是一些要求 。
设计并实现领域数据模型
实现增删改查API
在后端使用Mongo数据库
必须有Swagger文档API定义并且能方便的用多种语言生成客户端
运行在Docker容器中
能被部署在Kubernetes中非功能性要求
需要能很容易的调用其它语言的API
需要能够快速迭代(可能要突破常规)
必须有单元测试加分项
保守的内存消耗这对于当我想在一个内存受限的环境中(如一个512MB内存的树莓派)运行程序时 , 是很重要的 。
要有趣也要有学习体验使用的模块和库
作用模块访问数据库mongo-go-drive路由go-chiRESTAPIJSONPatch(译者注:RFC6902[1]和RFC7396[2])json-patch单元测试testifySwaggerAPI定义go-swagger优点
Go语言与C和Java十分的相像 。 有C和Java的基础能很容易的熟练掌握Go语言 , 完成一个入门项目 。
我特别喜欢Go代码的简单明了 。
公平来说 , 我也喜欢样板代码尽可能少的 , 备受好评的框架 。 我就十分喜欢Java11+或者Groovy与SpringBoot , SpringData , Lombok项目 , 可能还有SpringDataREST的联合使用 。 当然 , 有时候SpringBootDataREST的魔法有点儿过犹不及了 。
Go的'defer'关键字可以说是我最喜欢的特性之一了 。 推迟一些操作直到函数退出才执行这一特性 , 在关闭资源并记录函数退出动作的日志方面十分有用 。 不同点与不合适点
错误处理有点儿繁琐 。
错误处理对于Java背景的人来说有些不同 。 我发现在Go中它需要更明确 。
在Java中 , 一个方法能抛出一个异常 , 也可以捕获一个或多个异常 , 忽略它们(这样做可能是错误的) , 或者重新抛出给调用者来处理 。 Go需要使用先调用方法 , 然后判断是否有错误发生这种模式 。 我们可以讨论下这样做好不好 。
我发现对于Go的错误检测和传递需要一段时间来适应而且觉得有点繁琐 , 但这样肯定是能行的 。 //我经常在代码中看到这样的模式obj1,err:=doohickey.doSomething(someArg)iferr!=nil{log.Println("doohickey.doSomethinggoterrorerror:",err)return}obj2,err2:=widget.doSomethingElse(otherArg)iferr2!=nil{log.Println("WidgetdoSomethingElsereturnederror:",err2)return}//...
JSON响应类型以及映射到结构体
对于Go , JSON和静态类型 , 我发现Go在如何处理动态JSON和将其解析为结构体方面有些笨拙和令人困惑 。
这在Groovy和Python中相当容易 , 他们完全可以动态的把JSON转换成其他东西的映射 。
在Go中 , 将JSON反序列化为一个结构并将其序列化回来 , 这与其他语言中的做法并没有本质上的不同 。 成熟度进展
实际上 , 我在这方面并没有发现它有什么不好的 。 正相反 , 我发现了一些期待的地方 。 因为Go仍然是一门相对比较新的语言 , 在一些领域它正在迎头赶上 。
Go依赖和版本化模块库
因为以前使用过依赖管理和构建工具 , 如Java的Gradle和Maven , 自然而然的我就想Go有同种水平的依赖管理 。
在我写本文时 , GoLang1.13[3]支持谷歌的模块代理 , 文档上是这样说的:从Go1.13开始 , go命令在默认情况下将使用由Google运行的Go模块镜像、Go检验和数据库来进行模块的下载与认证 。 参看https://proxy.golang.org/privac[4]来了解有关这些服务的隐私信息 , 参看go命令文档[5]了解怎么停止使用这些服务或者使用另外的服务的详细配置 。 如果你依赖于一个不公开的模块 , 参见环境配置文档[6]结束语