大奖18dj18vip-大奖18dj18娱乐官网

【腾讯云】618云聚惠,百款云产品限量抢购,1核2G云服务器首年95元 http://cloud.tencent.com/act/cps/redirect?redirect=1059&cps_key=9f7b3aa0b9ee11c8648ef8bf9d4f15a9&from=console

大奖18dj18vip

查看: 31|回复: 0
打印 上一主题 下一主题

[资讯] 项目中要不要使用 Go?我是这么思考的

[复制链接]
  • TA的每日心情
    擦汗
    前天 14:55
  • 签到天数: 635 天

    [LV.9]以坛为家II

    硕士生

    1万

    主题

    1万

    帖子

    3万

    积分

    Rank: 8Rank: 8

    UID
    15343
    威望
    -561
    贡献
    8107
    在线时间
    321 小时
    注册时间
    2015-10-12
    跳转到指定楼层
    楼主
    发表于 2020-4-30 15:03:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    我最近决定在一个新项目中使用 GoLang 来实现一组增删改查的 API。在此之前,我较为熟悉 Java,Groovy,了解一些 Python。

    我大部分的经验都是使用 Java 或者 Groovy 加上 Spring Boot。这让我感到有些无聊,所以为什么不来学点儿东西找找乐子呢?


    要求

    以下是一些要求。

    • 设计并实现领域数据模型
    • 实现增删改查 API
    • 在后端使用 Mongo 数据库
    • 必须有 Swagger 文档 API 定义并且能方便的用多种语言生成客户端
    • 运行在 Docker 容器中
    • 能被部署在 Kubernetes 中

    非功能性要求

    • 需要能很容易的调用其它语言的 API
    • 需要能够快速迭代(可能要突破常规)
    • 必须有单元测试

    加分项

    • 保守的内存消耗
    • 这对于当我想在一个内存受限的环境中(如一个 512 MB 内存的树莓派)运行程序时,是很重要的。
    • 要有趣也要有学习体验

    使用的模块和库

    作用模块访问数据库mongo-go-drive路由go-chiREST API JSON Patch( 译者注:RFC6902[1] 和 RFC7396[2])json-patch单元测试testifySwagger API 定义go-swagger

    优点

    Go 语言与 C 和 Java 十分的相像。有 C 和 Java 的基础能很容易的熟练掌握 Go 语言,完成一个入门项目。

    我特别喜欢 Go 代码的简单明了。

    公平来说,我也喜欢样板代码尽可能少的,备受好评的框架。我就十分喜欢 Java 11+ 或者 Groovy 与 Spring Boot,Spring Data,Lombok 项目,可能还有 Spring Data REST 的联合使用。当然,有时候 Spring Boot Data REST 的魔法有点儿过犹不及了。

    Go 的 'defer' 关键字可以说是我最喜欢的特性之一了。推迟一些操作直到函数退出才执行这一特性,在关闭资源并记录函数退出动作的日志方面十分有用。

    不同点与不合适点

    错误处理有点儿繁琐。

    错误处理对于 Java 背景的人来说有些不同。我发现在 Go 中它需要更明确。

    在 Java 中,一个方法能抛出一个异常,也可以捕获一个或多个异常,忽略它们(这样做可能是错误的),或者重新抛出给调用者来处理。Go 需要使用先调用方法,然后判断是否有错误发生这种模式。我们可以讨论下这样做好不好。

    我发现对于 Go 的错误检测和传递需要一段时间来适应而且觉得有点繁琐,但这样肯定是能行的。

    • // 我经常在代码中看到这样的模式
    • obj1, err := doohickey.doSomething(someArg)
    • if err !=nil {
    •     log.Println("doohickey.doSomething got error error: ", err)
    •     return
    • }
    • obj2, err2 := widget.doSomethingElse(otherArg)
    • if err2 !=nil {
    •     log.Println("Widget doSomethingElse returned error: ", err2)
    •     return
    • }
    • //...

    JSON 响应类型以及映射到结构体

    对于 Go,JSON 和 静态类型,我发现 Go 在如何处理动态 JSON 和将其解析为结构体方面有些笨拙和令人困惑。

    这在 Groovy 和 Python 中相当容易,他们完全可以动态的把 JSON 转换成其他东西的映射。

    在 Go 中,将 JSON 反序列化为一个结构并将其序列化回来,这与其他语言中的做法并没有本质上的不同。

    成熟度进展

    实际上,我在这方面并没有发现它有什么不好的。正相反,我发现了一些期待的地方。因为 Go 仍然是一门相对比较新的语言,在一些领域它正在迎头赶上。

    Go 依赖和版本化模块库

    因为以前使用过依赖管理和构建工具,如 Java 的 Gradle 和 Maven,自然而然的我就想 Go 有同种水平的依赖管理。

    在我写本文时,GoLang 1.13[3] 支持谷歌的模块代理,文档上是这样说的:

    • 从 Go 1.13 开始,go 命令在默认情况下将使用由 Google 运行的 Go 模块镜像、 Go 检验和数据库来进行模块的下载与认证。参看 http://proxy.golang.org/privac[4] 来了解有关这些服务的隐私信息,参看 go 命令文档[5] 了解怎么停止使用这些服务或者使用另外的服务的详细配置。如果你依赖于一个不公开的模块,参见 环境配置文档[6]

    结束语

    令人惊讶的是,很容易地就可以掌握 GoLang 到实际生产的程度。我觉得它令人愉快而且很有趣。增强 REST API,精炼数据模型,生成 Swagger 文档和创建单元测试都是很流行并舒服的体验。

    基于这次的经历,我越发的想学习 GoLang 了。


    大奖18dj18vip社区温馨提示:
    大奖18dj18vip(www.dastanona.com)十分重视网络版权及其他知识产权的保护,针对网络侵权采取如下版权政策:
    1、大奖18dj18vip有理由相信网友侵犯任何人的版权或作品,(图文,文字,下载,视频,非法传播),大奖18dj18vip有权不事先通知即删除涉嫌侵权的作品和内容
    2、大奖18dj18vip将采取必要的网络技术手段,确认为侵权作品或内容的用户有权进行警告、屏蔽、删除的行为,尽可能的防止侵权行为的发生
    3、大奖18dj18vip影视资源均收集自互联网,没有提供影片资源存储,也未参与录制上传,若大奖18dj18vip收录的资源涉及您的版权或知识产权或其他利益,我们会立即删除
    4、大奖18dj18vip,删帖,投诉,举报,侵权,若大奖18dj18vip侵犯您的权益,附上身份及权利证明,请直接发送邮件到 kefu-sosoba@qq.com 我们将在一个工作日内删除
    soso大奖18dj18vip社区是聚合百度搜索,搜狗搜索,360搜索,新闻,教育,站长,广告,娱乐,影视,微信,网盘,营销,手机,汽车,游戏,论坛综合为一体的大型门户社区www.dastanona.com
    【腾讯云】腾讯云服务器安全可靠高性能,多种配置供您选择
    Powered by www.dastanona.com Copyright © 2013-2020 大奖18dj18vip社区 小黑屋|手机版|地图|关于我们|腾讯云代金券|帮助中心|公共DNS|大奖18dj18vip
    广告服务/项目合作: kefu-sosoba@qq.com  侵权举报邮箱: kefu-sosoba@qq.com  大奖18dj18vip建站时间:创建于2013年07月23日
    免责声明:大奖18dj18vip所有的内容均来自互联网以及第三方作者自由发布,版权归原作者版权所有,大奖18dj18vip不承担任何的法律责任,若有侵权请来信告知,我们立即删除!

    GMT+8, 2020-5-27 04:44 , Processed in 1.118416 second(s), 8 queries , MemCache On.

    快速回复 返回顶部 返回列表