云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

金山云_新创云迷你主机_优惠券

小七 141 0

让您的开发团队从Go开始

在DigitalOcean,Go正在迅速成为我们最喜欢的编程语言之一。经过几次内部讨论后,我总结出了一些想法,我想与新加入Go的团队分享(或者考虑在将来进行),使用外部代码,Go包的前景每天都在增长。人们正在共享高质量的代码,这些代码可以防止你重新发明轮子。有一些软件包可以帮助您完成各种任务,从实现复杂的算法和构建网络服务到通过goc与其他低级系统进行接口绑定。给定在现有的情况下,找到高质量的包来帮助您构建项目仍然是一个挑战。通过口碑传播和社交渠道(如Twitter),我发现了一些特殊的宝石,比如GoTigertonic和Insidence。是的,没有它们我们本可以过得去的,但它们提供的好处我们觉得没有必要复制-豪斯。那里也是一些存在的包存储库;但是,它们都不能被视为标准。有OSS Go这样的发布服务,但是如果你想找什么东西的话,它们是没有帮助的具体的。虽然这是个悬而未决的问题,围棋有个秘密武器:标准Go附带的库非常健壮,除非您正在寻找特定于行业或利基的东西,否则很有可能是标准库有一个完整的解决方案,或者是帮助您构建解决方案的垫脚石。与外部代码集成当您开始集成外部编写的包时,您应该注意*使用*外部包而不是*成为*外部包。外部API接口可能会改变,或者您的团队可能会决定需要用更健壮的东西来替换后端系统。使用Go的接口将应用程序与导入的包类型隔离开来;在这样做时,重点将转移到满足项目的需要上,而不是围绕一个你不拥有或控制的核心构建结束。如例如,如果您使用的是外部Redis客户机包,它导出如下内容:``[redis]{` package redis type redis struct{}func(r*redis)Get(k string)(*rediskPair,error){///ommited}````您可以在应用程序中使用此代码,但是你会遇到两个问题:第一个问题是,如果你想测试使用这个包的代码,你需要一个Redis服务器。第二个问题是,如果您需要额外的Redis客户端,您将无法轻松升级或交换功能。使用Go强大的接口,开始指定您想要的行为:``[go]{`package myapp type KeyPair struct{Key string Value[]byte}type KeyStore interface{Get(k string)(*KeyPair,error)}`````Next,您可以创建自己的封装外部依赖项的类型:``[go]{`package myapp func NewRedisKeyStore(){return&RedisKeyStore{r:雷迪斯。雷迪斯{},}}}func(rks*RedisKeyStore)Get(k字符串)(*KeyPair,err){rkvp,err:=rks.r.Get(k)if err!=nil{return nil,err}返回密钥对{Key:rkvp.键,值:rkvp.值,},nil}`}```最后,您可以使用包装器,或者在测试中交换包装器,而不是显式使用外部Redis客户端:```[go]{` type MockKeyStore struct{Dict map[string][]byte}func NewMockKeyStore(){return&MockKeyStore{Dict:map[string][]byte{},}}}func(mks*MockKeyStore)Get(k字符串)(*KeyPair,error){return&KeyPair{Key:k,值:mks.迪克特[k] },nil}`}```管理依赖项一段时间后,您所依赖的包将被更新修复错误并添加新功能。您很快就会发现,"goget"并不是维护和组织依赖关系的可靠解决方案。这里有两种解决方案可以尝试:提供依赖关系或使用外部工具,如[godep](https://github.com/tools/godep)。团队评估了自动售货软件包,但很快发现它可能会让人难以承受。因此,我们目前倾向于使用godep来管理我们的依赖关系。它提供了一种确保使用显式包的方法。请记住,它不是以声明方式这样做的,因此在保存之前,必须确保安装了正确的版本天哪。什么时候我们的工程团队对管理依赖关系有很强的把握,这也是一个尚未解决的问题。目前还没有一个简单的,Go社区接受的声明性解决方案,它允许我们指定外部依赖项和我们想要使用的确切版本,您的团队可以在[Go Wiki工具页]上评估一些解决方案(https://code.google.com/p/go-wiki/wiki/PackageManagementTools)。你的团队可能会欣赏Go的一个优点,那就是它不需要占用大量资源的IDE来提高效率。您可以使用您已经熟悉的文本编辑器并开始编写代码。如果你不做任何研究就这么做了,你就会错过那些有助于提高效率的扩展。我用Sublime文本编写Go,流行的gopublime插件提供了诸如代码完成和格式化等功能。其他团队成员使用[Vim Go](https://github.com/fatih/vim-go)有大量成功。又一个需要关注的工具是Oracle—它提供了源代码分析,可以帮助您导航项目。从计算表达式到理解类型和调用方,Oracle在编辑器中的集成将极大地提高开发人员的生产率。如果您使用Emacs或Atom,今天就可以尝试一下包裹。我们的团队已经确定了一个具有多个存储库的单一工作区。如上所述,这仍然是依赖性管理的早期阶段,但由于我们确保团队以类似的方式处理所有项目,因此多人能够同时处理多个项目,而无需任何专业问题。正在部署在编写完软件之后,您需要在生产环境中运行它。使用像fpm这样的工具来构建deb和rpm,并将它们部署到您的生产中。您将获得能够从具有显式版本的内部存储库进行部署的价值。由于Go编译为一个二进制文件,因此对管理。作为举个例子,您可以创建一个Makefile来构建deb:``[go]{`VERSION=0.5.0 build=$(shell git rev list--count HEAD)widget dpkg:mkdir-p deb/widget/usr/local/bin cp$(GOPATH)/bin/widget deb/widget/usr/local/bin fpm-s dir-t deb-n widget-v$(VERSION)-$(build)-C deb/widget.````````````````````````````````````手工创建包时,请考虑使用连续集成系统作为构建器。这样,每次成功构建后,您都将得到一个最新的包。我们目前正在使用无人机.IO持续集成。我们还将使用makefile来实现任务的自动化,这是众所周知的,也是确保每个接触代码的人都可以测试和构建的好方法它。拿走Go的EcosystemGo的优势提供了一些工具,使其更容易在其生态系统中工作。DO团队使用"golint",它可以发现简单的错误,并确保每件事情都至少有一组最小的文档。使用"godoc",我们有一个易于使用的界面,可以查看项目中包含的所有代码的文档。果郎坚果邮件列表是一个无价的资源。所以到目前为止,我们对围棋的短暂尝试取得了巨大成功。不熟悉这门语言的开发人员已经大量增加,并且很快就有了生产力。这种语言的开发速度,加上它易于掌握的并发性,使我们能够以更快的方式编写更好的软件。我们在重写我们的液滴控制台的同时尝试了Go,这一经验让我们有信心在多个新的平台上前进项目。如果你的队伍还没试过去,应该是你的短处列出。写我们继续编写新的服务,重写旧的服务,我们对这种语言在构建分布式系统方面的优势有了更深的理解。如果你是一个对写围棋感兴趣的软件工程师,我们正在招聘。*哦,如果你有写围棋的经验,可以在下面发表评论并分享你的想法。*作者:Bryan Liles