七牛首席布道师:Go不是在颠覆,就是在逆袭

超轻量级自动化部署神器Drone配合Gogs安装详细教程(图文教程) 前言 现在我们在日常开发或者生产环境中,往往会经常弄一套自动化部署方案来节约时间成本。现在比较流行的一种就是Gitlab+Jenkins实现方案,但是这种方案占用内存还是比较大,需要的服务器内存也得8G左右,不然很难流畅运行,而且部署起来也不快。最近小翔发现了一款神器 Drone ,轻量级的CI/CD工具,我拿来结合 Gogs 使用所消耗的内存占用都不到1G,这里就给大家聊聊这款工具。 Drone简介 Drone是一款基于go编写的容器技术持续集成工具,可以直接使用YAML配置文件即可完成自动化构建、测试、 阅读详情
摘要:7月30日的在线培训《Go语言编程》,七牛云存储联合创始人兼首席布道师徐立(@飞天急速徐倒立)将带来 Go 的前世今生与 Go 语言编程的基础教学,以及七牛云存储应用 Go 的实践分享。

Go 语言是谷歌 2009 年首次推出并在 2012 年正式发布的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去10多年间软件开发的难度令人沮丧。Google 对 Go 寄予厚望,其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。Go 的速度也非常快,几乎和 C 或 C++ 程序一样快,且能够快速开发应用程序。

7月30日的在线培训《Go语言编程》,七牛云存储联合创始人兼首席布道师徐立(@飞天急速徐倒立)将带来 Go 的前世今生与 Go 语言编程的基础教学,以及七牛云存储应用 Go 的实践分享。报名地址:http://huiyi.youkuaiyun.com/activity/product/goods_list?project_id=1202

在课程开始前,优快云 对徐立进行了简单的采访。七牛云存储是用 Go 语言开发实现的,而七牛可以说是全球第一个最早用 Go 吃螃蟹还吃得很香的大玩家。徐立认为 Go 是划时代的,唯有 Go 能成为史诗之绝唱!Go 不是在颠覆,就是在逆袭!Go 在当下必然大有可为,大有作为,事在人为。

七牛云存储联合创始人兼首席技术顾问和首席布道师 徐立
七牛云存储联合创始人兼首席布道师 徐立

请您先简单和大家介绍一下自己,能谈谈您的技术成长历程吗?


Hi,大家好!我叫徐立,默默无闻至今做了十年码农,必须感谢漫长的码农岁月在侵蚀我花样年华的同时又栽培了我,如今依然还是一个充满技术理想情怀的热血青年!同时,也是一个想用更好的技术创造出一些更加美好体验的互联网创业者。当前,我与我的团队们正在一起努力铸造 “计算机网络世界里边同时也是我们这个星球上最具特色并还可以更加惊艳的数据仓储及物流系统” ——七牛云存储,一款为广大应用开发者一站式解决文件加速上传和加速下载以及个性化云端数据处理的云服务,目标是让天下没有难写的代码和难搞的运维,以此可以让广大应用开发者过上 “Lazy coding, happy life!” 的幸福美好生活。

我在中学年间开始接触编程,那时从网上偶尔接点活儿挣点游戏点卡和零花钱,从早前比较偏向实用功能的业务层应用开发(比如软件和 Web )做到后来比较底层的系统技术(比如分布式计算和存储),对于互联网技术日新月异的发展一直保持着敬畏与追随。在中国互联网发展演进的这十几年间,快速经历了桌面软件,PC 互联网,移动互联网,互联网硬件,云计算服务这样一个快速变革的时代,算是一个在互联网高速成长的时代背景下土生土长出来外表粉嫩内心沧桑的程序员。如果要采访我和电脑摩擦相爱了至少十年为什么还是这么年轻粉嫩?我会毫不迟疑地告诉你能够抵挡岁月无情摧残的唯有激情与才华,还有梦想。由于现阶段的工作需要,不少精力都投放在与互联网前沿技术相关的学习与分享交流,比如最近分享的 Docker 和 Go 的话题。我喜欢把经过实践检验后沉淀下来的美好事物分享给大家,俗称布道师,当前也是七牛的首席布道师。如果你同样也是一个有着技术理想情怀的热血青年,相信我在当下这样一个技术驱动变革的时代你不是一个人在骚动,如果你已经按耐不住心中的喜悦和热情,欢迎联系我(xl@qiniu.com),欢迎来到七牛。七牛,不只是几头牛,你会发现更多!

您是从何时开始关注 Go 语言?是什么原因促使你们团队决定使用 Go 语言?以及是什么原因促成了《Go语言编程》这本书呢?


2009 年 11 月 Google 首次对外公开透露 Go 的存在后,就一直有保持关注。但真正开始使用 Go 语言大规模投产是在 2011 年上半年,当时是在和我们团队的早期成员使用 Go 语言研发分布式对象存储系统。

与此同时,市面上几乎没有发现和我们一样这么大规模玩 Go 语言的个体或组织。客观地说,我们这样做的确很冒险,连 Google 官方当时也没有这么干,且 Go 语言官方正式版都尚未发布,Google 发布 Go 1.0 是在过了一年之后。记得项目启动早期,我们对于要不要使用这么一门还在萌芽生长状态的编程语言来构建线上的大规模系统,内部成员曾各抒己见略有争议。后来根据我们团队成员的经验自我剖析判断下来,确定这事可行 。原本存储系统我们做过好几遍,实际也跑过几个线上大规模运营的自研存储系统,且成员资历都是十几年的资深研发工程师(只有我个人资历最小当时还不到十年)。且早前我们在 2006 年尝试使用 C++ 开发分布式存储系统,后来又有尝试使用 Erlang 替代,直到后来我们注意到问世不久的 Go 让我们是既兴奋惊喜又相见恨晚。在被 C++ 实现并发编程框架折腾得够呛之后,又遇到天生为并发而生的 Erlang,但实际上又被 Erlang 不能满足我们预期的高性能计算而堪折;而当遇到 Go 并实际写了一些程序测试检验过之后,发现不但用 Go 编程写代码很顺溜很开心,关键在执行效率和性能上也是非一般地惊艳。一个把 C++ 的性能优势以及 Erlang 天生的并发特性相融合的产物,且语法语义上要比 C++ 或 Erlang 简约不止几个数量级的编程语言,同时还是一帮世界上顶尖大牛的巅峰之作以及 Google 的大力投入支持,还有经过我们这群爱折腾的码农呆瓜们充分的测试和检验得以确认,何乐而不为。常言道实践出真知,并不是我们盲目冒险决策用 Go,只不过是我们早在几年之前第一个吃了螃蟹且经实践检验得出了的明确的结论而已。

当初使用 Go 语言编程的时候,市面上除了官方网站公开可查阅的文档以外,可以参考的资料读物相当甚少,团队成员也是现学现用彼此交流互补。早期其实并没有诞生写书的想法,只是觉得公司团队壮大起来以后一定需要有份系统的文档手册方便新人上手学习,对我们自己来讲这本身就是一个强烈的刚需,没有任何理由不去执行。然而,后来内容越写越丰富,微博上等技术圈子里也知道七牛用 Go 且很吃香,就有出版社机构慕名前来找到我们,再后来就有了出书这回事儿。但在当时,我们只有为数不多的几个人,都是研发重活揽了一堆事情,是写代码赶工期还是出书是个很纠结的态度取向问题。在经过团队成员一致达成共识后,秉着 “技术驱动创新”,“美好的事物就该分享”,“独乐乐不如众乐乐”,“一个人走得虽快但一群人才能走得更快更稳” 等一系列等推动人类文明向前发展的各种鸡汤洗礼陶醉之后,我们自发地默同接受新增任务并开始组织团队协作完善《Go语言编程》一书,开放分享技术经验心得的同时收获反馈和喜悦,希望有更多的人和组织能够参与进来用 Go 去谱写他们的故事和美妙篇章。后来,事实也的确证明:越来越多的个人和组织以及大大小小的互联网公司都开始使用 Go 语言去承载他们的海量业务,以及听闻个别开发者终于习得 Go 心经之后实现了他们内心积压已久的技术理想。海外甚至都开始有长篇大论开始分析探讨 “Why is Golang popular in China?”,用 Google 搜索 Golang 热度最高的至今一直是中国。放到当时去看,这块大陆是有多么荒芜;今天再回过头来看,江山又是如此多娇。尽管当时白天要忙写代码晚上要忙写书最终仓促出版留下了些许审校上的遗憾,但不管怎样,那都是一段义无反悔的铿锵岁月。

Go 语言的哪些特点最吸引您?


并发

Go 最大的特色就是在语言层面天生支持并发,不需要像其他大多数编程语言那样需要开发者自行实现或借助第三方类库实现并发编程,Go 在语言级别支持的并发编程,其逻辑简化得通俗易懂简单好上手。

性能

不同于大多数脚本或解释性的高阶编程语言,用 Go 编写的代码直接了当编译成机器码高效执行。

简洁

25 个关键字即表达你能想到的所有招式,没有也不需要有任何多余,想干啥事就 go 一下。

跨平台

x86、AMD64 (x86_64)、ARM;Linux、Windows、Darwin (OSX)、FreeBSD、Android (计划Go 1.4) 几乎全平台支持,真正做到一份源码,随处编译,到处运行。

Go 语言都有哪些常见的应用场景?


作为一个 Go 语言的重度用户来看,当前除了不适合拿来造操作系统以外在操作系统之上应用级的事情都能干。再更具体一点,比如说适用于这样一些使用场景:

系统应用

以前要用 C/C++ 做的系统应用,现在都可以用 Go 来写,事半功倍,而且 Go 完美包容 C 源代码,两者互相调用还可以混合编译从而无缝集成。

网络应用

包含了常见的服务端编程比如 Web 和 API Service,以前用 PHP / Python / Ruby / Java 干的事情现在都可以用 Go 更加简单清晰的来写。再比如还可以拿来做一些 Proxy(代理)如网络穿透软件等,你懂的。

分布式系统

基于 Go 强大的系统编程加网络编程,打造各种跨网络的分布式系统服务,Go 社区有不少和分布式系统相关的开源产物。

各种形态的存储和数据库应用

比如 groupcache,influxdb 等。

客户端应用

包括带界面的桌面软件,以及后续可以想像的移动端应用(比如对 Android 的支持)。

云服务(PaaS)

如基于 Go 打造的七牛云存储(分布式对象存储系统),比如基于 Go 编写的 Docker(一款开源的容器虚拟化产物)。

Go 能做的事情,包含但不限于以上罗列的使用场景。

Go 语言在七牛中都开发了些什么服务?在七牛的代码量中,Go 语言使用占多少比例?


我们主要使用 Go 开发了以下服务和工具:

  • 分布式存储系统 ( Distributed Key/Value Storage)
  • 数据处理服务 (Data Processing)
  • 网络接口服务 (RESTful API Service)
  • 消息队列服务(Message Queue Service)
  • 日志处理系统 (Log Service)
  • Web 网站 (不含前端 JavaScript)
  • CLI 命令行和 GUI 图形界面工具
  • 其他辅助工具

总的来讲,Go 在我们七牛的工程中代码覆盖率超过 90% 。还有 10% 不能覆盖的原因是我们给开发者自助使用的 Web 界面需要用 JavaScript 编程来实现酷炫的前端,以及我们为开发者准备了多达超过 10 种编程语言的 SDK 。

Go 有哪些成功的开源项目?都有哪些公司在使用?


Go 比较热门的开源项目,不完全罗列举例:

  • docker - 基于 Linux 容器技术的虚拟化实现,能够轻易实现 PaaS 平台的搭建
  • packer - vagrant 的作者开源的用来生成不同平台的镜像文件,例如 QEMU、KVM、Xen、VM、vbox、AWS 等
  • drone - 基于 docker 构建的持续集成测试平台,类似 jenkins-ci
  • libcontainer - docker 官方开源用 Go 实现的 Linux Containers
  • tsuru - 开源的 PaaS 平台,类似 GAE、SAE
  • groupcache - Memcached 作者(Brad Fitzpatrick) 写的用于 dl.google.com 线上使用的缓存系统
  • nsq - bit.ly 开源的高性能消息队列系统,用以每天处理数十亿条的消息
  • influxdb - 开源分布式时序、事件和指标数据库
  • heka - Mozilla 开源的日志处理系统
  • doozer - 分布式同步工具,类似 ZooKeeper
  • etcd - 高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。灵感来自于 ZooKeeper 和 Doozer
  • goandroid - 使之用 Go 编写动态库,在原生的 Android 应用中运行
  • mandala - 基于 goandroid 的工具链,用 Go 编写原生的 Android 应用的一个便捷框架
  • beego - 国内 Go 开发者开发的 Web 开发框架
  • revel - 另一个高产的 Web 开发框架,类似 Java Play Framework

更多: https://code.google.com/p/go-wiki/wiki/Projects

用 Go 的公司,不完全罗列举例:

国外:

  • Google、YouTube、Dropbox、dotCloud、10gen、Apcera、Mozilla、Heroku、Github、Bitbucket、Bitly、CloudFlare、Cloud Foundry、Flipboard、Disqus、SendGrid、Tumblr、Zynga、Soundcloud

  • 更多:https://code.google.com/p/go-wiki/wiki/GoUsers

国内:

在本年度 2014 Androiday.Org 开发者大会上,您有个主题演讲提到了 Go 对 Android 的支持,能否与我们分享一下这块的研究心得?


这是一个很有趣的话题,尤其是在今年6月份相继召开了 APPLE WWDC 2014 和 Google I/O 2014 两场举世闻名的互联网科技盛会后,APPLE 发布了用于 iOS 下一代编程的 Swift 语言,这给关注 Android 的开发者们留下了无限的遐想,尽管后来惊喜并没有如人们预期一样出现。作为一个纯洁的 Android 程序员,大概不会关注到 Go 将要支持 Android 的消息;作为一个无邪的 Go 程序员,大概也不会去关心 Android 开发和未来。但戏剧性的就是,我们当下就是处于这样一个各种跨界的大融合时代,没有什么不可能。

由于 Go 是跨平台编译的,早前就有在 ARM 上编译 Go 并成功运行的尝试。这个尝试是直接将用 Go 编写的源代码在 ARM 环境下编译,然后调用 adb shell 装入 Android 里边作为 Linux 下的可执行文件运行,但是没法关联支持 JNI(Java Native Interface),只能作为一个独立的进程运行,然后通过 RPC、TCP 等协议方式通信,相当于是一个 App 在运行方式上分成了两部分,这样非常不利于 App 的状态管理,所以此方式无法用 Go 编写出无缝结合的 Android 应用。

然而,单方面想要用 Go 语言封装 Android SDK 更是难以行通的:Android 原本用 Java 封装的 SDK,包含了海量的 API 接口。如果是手工封装会导致功能上的欠缺,自动封装会让 Go 语言变得丑陋不堪。不管用哪种方式,都很难快速实现。若是用 Go 再实现一遍 Android SDK 且还想期望能与 Java 等效,这几乎是不可能的事情。

但实际上,Android 系统提供了两种开发包:SDK 和 NDK。用 Go 移植 Android SDK 不通,还可以尝试走 Android NDK 。

Android NDK(Native Development Kit )是一套开发工具集合,允许开发者用像 C/C++ 语言那样实现应用程序的一部分。然后可以通过 JNI 实现 Java 代码与 NDK 动态库的无缝集成。

Go 内置 Cgo,使得 Go 和 C 之间可以无缝地互相转换和调用,以及代码混合编译。仅此一点,就可以看出至少也为 Go 进行 Android NDK 开发奠定了基础。当然,Go 可以进行的扩展尝试可可以更多。

后续的尝试是另辟蹊径走 Android NDK,借助其可以将动态库 .so 和 Java 代码一起打包成 apk 的机制,实现在 Android 上的无缝加载和运行。所以,问题简化成只要 Go 能够编译出 .so 动态库再通过 Android NDK 就可以实现开发 Android 应用程序了。

Go 是一门纯粹静态类型的编程语言,编译出来的二进制是静态的,如何构建动态库,这是一道坎。不过 Go 社区的欣欣向荣完全超出你我的想像,比如 Go 社区里边有人发布了个开源项目叫 Goandroid,一个扩展了 Go 的工具链和运行库来支持将 Go 代码创建动态库(*.so)的工具。另外一个开源项目 Mandala 则是在基于 Goandroid 的工具链构建了一套完善的用 Go 开发原生 Android 应用的开发框架。

Goandroid 和 Mandala 的出现已经让 Go 开发原生 Android 应用成为现实。 尽管这两个框架都是 Go 社区由个人发起的开源项目,Go 官方尚未参与,不过 Go 已经打开了 Android 的潘多拉魔盒。

另外,可以再来扒一扒和技术无关的业界新闻。

2014 年 5 月,一场已经持续 4 年的官司:关于“Google 在 Android 平台使用 Java 侵犯知识产权”一案,联邦法院判定 Oracle 获胜。

2014 年 6 月,APPLE 公司在 WWDC 2014 上发布 Swift 编程语言,用来替代 Objective-C 更高效地编写 iOS 和 OS X 程序。

2014 年 6 月,Google 公司 Go 语言开发团队成员 David Crawshaw 提议下一个 Go 版本 ( Go 1.4 ) 支持 Android 平台。这算是一个关于 Go 支持 Android 而言相当掷地有声的宣称。文献详见:http://golang.org/s/go14android

就目前而言,Go 支持 Android 后可以干啥。简单来讲,Go 以支持 Android NDK 编程作为切入点,自然是可以在 NDK 这层注入 Go 所能带来的新鲜活力,比如在异步的并发编程上用 channels 而不再是 callbacks 通讯,比如为游戏引擎提供底层的高性能支撑,比如跟多媒体相关的更丰富地处理。所以,可以想像的到 Go 是可以引领 Android NDK 迎来一片生机盎然的春天。

Go 支持 Android 这事当前看起来是 Go 的一厢情愿,而 Android 对此结合似乎还无动于衷。然而, Android 背负的包袱毕竟过重。Go 跃出的一小步,开启的必然会是 Android 海阔天空的一大步。

谈谈您个人对 Go 语言的理解和看法?


尽管 Go 是一门问世不久显得很新的编程语言,有很多质疑的声音认为新生的事物就是不成熟就此望而却步。但在我个人看来,考量成熟的因素并不完全取决于它所经历和走过的岁月,而是在于它是否可以被当下这个时代所需要并赋予厚望,以及其心智和能力是否能够承载并担当得起这份荣耀与责任。

在我们今天这个时代,是一个包含了 PC 互联网、移动互联网、物联网和云计算 “四世同堂” 的技术多元盛世。在不曾久远的过去,此前的数十年间,没有哪一门编程语言能够经得起此般岁月的几经摧残而长生不老。70 年代就开始基业长青的 C,书写了整个单机时代的辉煌,在硬件更新换代多核一度再翻成指数级更迭又如此瞬息万变的今天,C 那副认真憔悴的注目神情所表达的静静默守和激流勇退才终归得以明白它曾有过的卓绝。而 Java / Python / PHP / Ruby 此前彼后所纵横的 PC Web 时代,以当下之势在此不可逆转的时代背景下正似岁月如梭般地离我们渐行老去。而当移动互联网悄然踏至的那一时刻,Android 势如破竹般地野蛮生长搭救了 Java 一命并在其身上倾覆了所有,换来的却不过是一份难以割舍又无法言痛的沉重爱情,在被包养换主后的 Java 擦伤了贞洁之后不得不忍辱负重潸然泪行,而 Java 也从此难以走下一座叫作 “节操” 的断背深山。而和 Java 长得很像极帅的那位 JavaScript,意气风发一竿子捅到底逆袭了整个 Web 后端,讨得所有 Web 前端开发者的拥簇和狂欢,眼看高举全栈工程大旗就要翻手为云覆手为雨,却优秀得不懂克己错失风向与当下这个多核时代格格不入,曾一度与 HTML5 结队合唱 “轻应用就是未来” 这一出双簧,不料 Apple Swift 以迅雷不及掩耳之势以逆袭之道还治其逆袭之身;如今既生 Go,又何生 NodeJS,感慨 Node 君真是生不逢时。总之,问君能有几多愁,掐指一算,不知诸君该何去何从……

虽群雄逐鹿,现百家争鸣,然乱世必有新生。 Go 有如清水出芙蓉,一个曾在温柔的岁月里深沉熟睡,尔后随着换季时节的轻声絮语呼唤苏醒,然后起身刹那之间不经意惊艳了时光,此后就在此应时之季娇艳绽放,随后波光花影,激荡涟漪,满是春意盎然,勃勃生机。

时光往回倒流近二十年,那是 1995 年,有几位计算机泰斗,在白纸上画了一个圈,开启了分布式系统编程时代的春天。那时还在贝尔实验室参与九号计划(Plan9)的 Robert C. Pike(Plan9 操作系统和 UTF-8 的共同设计者,分布式编程语言 Limbo 作者) 和 Kenneth Lane Thompson(1983年图灵奖得主,创建了 UNIX 和 Plan9 操作系统,B 语言和 C 语言的共同设计者,UTF-8 的共同设计者),在此段工作经历中开发了分布式网络操作系统 Inferno,并在此之上实现了分布式编程语言 Limbo,这是能够追溯到最早和后来的 Go 在功能特性上比较相似的前身。随后这两位泰斗相继都加入了 Google 公司,在 2007 年 9 月,这两位 Unix 和 C 还有 UTF-8 的始祖成员,再加上 Javascript V8 引擎和 Java HotSpot 编译器的作者 Robert Griesemer 一起,这 3 人小组设计了最初的 Go 语言雏形。此后,Go 语言逐渐吸引了一些业界优秀人物比如 80 后程序员 Brad Fitzpatrick(Memcached 作者,OpenID 协定者)的加入,Go 的团队阵营逐渐壮大。从 2007 年 9 月作为一个 Google 20% 自由时间的一个实验项目;到 2008 年 5 月发展为 Google 100% 支持的全时项目;再到 2009 年 11 月;Google 首次对外公开透露 Go 的存在;以及 2012 年 3 月,Go 1.0 官方正式版问世;Go 的演变和发展简直始料未及,从开始到现在都是一如既往地突飞猛进,一发不可收拾。

如果说到 Java 曾经的流行,我们会联想到 SSH(Struts + Spring + Hibernate);如果提到 Python,也会联想到 Django;如果提到 Ruby,会联想到 Ruby on Rails;如果提到 JavaScript,会联想到 NodeJS;如果提到 PHP,更是一堆长江后浪推前浪前浪死在沙滩上的 Web 开发框架。这些编程语言社区的繁荣昌盛无一例外都和 Web 开发息息相关,且最终沉淀下来的都是各种五花八门各有千秋的众多 Web 开发框架。可以说,我们当前所面临和 Web 开发的技术选型,从未有过如此的繁荣。繁荣的背后,衬托的是一个大江东流去不复还的 PC Web 时代。

我们再来看看 Go 的社区,是多么地非同寻常和多样丰盛。我们之前列举过 Go 社区里边比较流行热门的开源项目:比如 Docker,是时下最流行和容器虚拟化相关的技术产物;比如 GroupCache ,是一个类似或代替 Memcached 的分布式内存缓存系统;比如 nsq,是一款处理海量并发的消息队列系统;再比如 etcd,是一套用于配置同步管理的分布式键值存储系统;以上这些都是和网络和系统服务以及分布式相关。再比如 Goandroid,是一个开发 Android NDK 应用的工具,是和移动开发相关的…… 总之,有太多创新的开源产物,而 Web 开发框架都不是主要重点。Go 几乎涵盖了和编程领域相关的所有点和面,在 Go 1.0 正式版出现后的两年时间里,基于 Go 可以枚举全面覆盖的开源项目超过了 1000 个。可谓是随风潜入夜,润物细无声。

从 Go 诞生的时代背景和团队阵容以及开源社区的繁荣来讲,Go 并不是新生不熟,而是后生可畏,且极有可能成为一统天下的集大成者。

我们再来看一些实际使用场景,比如 Web 开发。大多数编程语言之上的 Web 开发框架都是遵照 MVC 的处理流程去开发 Web 应用:Model 部分封装数据,Controller 部分处理业务逻辑,View 部分植入变量填充模板页面。而大部分 Web 框架关于 MVC 的三部分都是在 Server-side 处理,比如对 View 部分的处理都是在 Server-side 通过程序动态对模版变量求值后再拼接组装成 HTML 页面输出给浏览器去呈现。而 Go 开发 Web 应用,并不依赖任何 Web 开发框架,用内置的标准库就可以轻而易举地实现:比如使用 net/http 标准库就可以数行代码构建一个完整的 Web 骨架应用;再比如,通过关键字 struct 封装一个数据结构就可以表达原本 MVC 框架中需要用厚重的 ORM (Object-Relational Mapping) 才能表达的那部分。大道至简,这可以说是 Go 的哲学。在 View 这一层,Go 也有相应标准库提供支持,但更推荐的做法,是当下比较流行的 MVVM (Model-View-ViewModel):Server-side 只输出 JSON,浏览器 DOM 作为 View 层,前端 JavaScript 充当 Contoller 部分;这样,不仅减少了 Server-side 的资源消耗还有中间传输的网络流量,而且前端可以更灵活和更丰富,后端也可以更轻盈和更高效,也更有利于项目的分工和协作。 而 Go 对 JSON 的生成和输出,有数据测试表明异常高效(在 i7-2600K 处理器上针对所有编程语言包含开发框架总计约100个测试对比中,Go 的性能指标稳居第一,详见:http://t.cn/RvZHyKI)。以我个人喜好之见,后端用 Go 前端用 AngularJS 可以说是现今流行 MVVM 方式的 Web 开发之绝唱组合。所以,如有疑问 Go 适不适合用来做 Web 开发,我想答案很肯定的:不但可以而且更简单同时做得更出色甚至还可以做的更多。

我们再来看看当下硬件突飞猛进的多核时代,软件层面的编程语言都有哪些支持和作为。“人生苦短,我用 Python”,被喊了这么多年的标语,是有多少有追求和品味的程序员都热衷于 Python。我想大家可以做个实际测验:比如用 Python 写一个死循环程序,然后运行起来,过一小段时间看看 CPU 占用率是多少。测试结果会是什么呢,CPU 会占用 100% 吗?不好意思如果是那应该是单核,且还得是没有超线程支持的骨灰级 CPU 才行!在当下普遍的双核(甚至 4 核或 8 核) CPU 上,这个死循环跑满最多只会占用不超过 50% 的 CPU 资源。好吧,你会说我开多个线程并行来跑这个死循环不就可以吃满 CPU 了吗?我想测试结论可以很明确的告诉你,多线程的方式并行跑这个死循环可是连 50% 的 CPU 都吃不到,不信你可以试试,呵呵。无需我解释为什么,大家可以自行 Google 搜索看看 GIL (Global Interpreter Lock) 机理。也不是我特别拿 Python 举例,PHP / Ruby / NodeJS 的程序员们也可以来做做同样的测试,呵呵。总之,一个简单得不能再简单的死循环,程序上再怎么优化,跑起来都吃不满 CPU,你说我们都是这么有品味的程序员,到底都是在追求些什么呢?这些 PC Web 时代下的脚本语言或者字节码解释型的语言,几乎都由于线程安全问题而在语言级的并发机制上裹足不前。尽管 Ruby 实现了很华丽的纤程,NodeJS 实现了很光线的非阻塞 IO,但始终逃离不了单线程简单可依赖原则抑或多线程效率提升但伴随着各种问题困扰从而不得不折中取舍的桎梏。所以,大部分时候,语言层面没有根本性地解决并发问题,转而使用传统的多进程这一外援策略去解决并发需求以及变相地迎合这个多核时代。然而,硬件很快,软件很慢,摩尔定律在硬件行业的应验带给传统软件行业的红利已经走到了尽头。

我们再来看看 Go 在当下这个多核时代的作为。不得不说,Go 最大的特色就是在语言层面天然支持并发,在 Go 程序里边,你可以通过在一个函数调用前使用关键字 go 即可让该函数 func 运行成为一个独立的 goroutine,goroutine 可以理解成一种比线程更加轻盈更省开销的轻量级协程。Go 的并发模型就是通过系统的线程来多路派遣这些独立函数的执行,使得每个用关键字 go 执行调用的函数可以运行成为一个单位协程。当⼀个协程阻塞的时候,调度器就会自动把其他协程安排到另外的线程中去执行,从而实现程序的无等待并行化运行。且调度的开销非常小,单核 CPU 调度的规模不下于每秒百万次,这使得我们能够创建大量的 goroutines,从而可以很轻松地编写并发程序达到我们想要的目的。

同时,Go 在语言层面还引入了 channel 这一内置类型来实现并发执行体 goroutines 之间的消息传递,通信靠 channels 来传递消息。Go 遵循 CSP(Communicating sequential processes) 并发模型,通过通信来共享内存而不是用共享内存的方式进行通信。Go 的并发里边没有共享内存,更没有内存锁,这一切都有利于进行更为安全和简单的并行程序编写。

终有一日,你会感慨:“人生苦短,说 Go 就 Go”!

时代在快速跃迁,尤其是现在言必及多核和并发,我们所看到的那些 PC Web 时代下的脚本语言所堆砌的华丽不过是一些延续性追随,而且这种延续性的步伐会越来越沉重,最终还是苦不堪言。唯有 Go,在语言层面对并发和多核乃是纯天然的支持,原本就是一场应时而生顺时而为的土生土长,Go 所代表的是一种破坏性创新。而我们所经历的这个时代,正是处于一个时代被时代所颠覆的时代,在这样一个转折点,所有的延续性创新不过是杯水车薪,唯有破坏性创新,与时代共舞,才会产生革命性的颠覆。

我们还可以回顾下之前提到 Go 对 Android 移动端非侵入式的支持,几乎就是一场悄无声息的逆袭。

Go 很年轻,却已健壮成年。Go 被设计得简洁高效,Go 在语法层面有着清晰简洁却又高效的表达能力,是一个让开发者编写程序很开心同时又更有生产力的系统编程语言。Go 在语言层面有着良好的并发支持,使得用 Go 语言编写多核和分布式网络的应用程序简单容易许多。Go 内置新颖灵活的类型系统还可以很方便地编写和构建模块化程序。Go 是一门需要编译源码才能运行应用的纯静态强类型语言,这点保证的了程序的安全性和执行效率,且 Go 从程序源代码编译成机器码非常快。Go 的跨平台支持,使得用 Go 语言编写的程序可以在现今大多数操作系统上编译运行。Go 还自带垃圾回收的内存管理机制,并且支持强大的运行时反射。Go 是动静相宜的,在性能和安全性方面保留了静态语言的优点,在编程写法上,却有着动态语言的灵活与优雅。

Go 是划时代的,唯有 Go 能成为史诗之绝唱!Go 不是在颠覆,就是在逆袭!
Golang + Drone CI 实战:打造轻量级自动化部署系统 在当今软件开发领域,自动化部署已经成为提高开发效率、保证软件质量的关键环节。本项目的目的是利用 Golang 强大的并发性能和高效的编译速度,结合 Drone CI 灵活的持续集成和持续部署(CI/CD)能力,打造一个轻量级的自动化部署系统。该系统将涵盖从代码提交、构建、测试到部署的整个流程,适用于各类基于 Golang 的项目,无论是小型的个人项目还是大型的企业级应用。本文将按照以下结构进行组织:首先介绍核心概念和它们之间的联系,让读者对 Golang 和 Drone CI 有一个清晰的认识; 阅读详情

相关推荐

Go 编译器:一门强大的编程语言

它通过多个阶段的处理,包括词法分析、语法分析、类型检查、中间代码生成、优化和代码生成,最终生成高效的可执行文件。通过使用Go编译器,开发者可以将他们的Go程序编译为可执行文件,并在目标机器上运行。它的编译器是Go语言开发的核心组件之一,负责将Go源代码转换为可执行的机器码。词法分析(Lexical Analysis):Go编译器首先对源代码进行词法分析,将源代码划分为一个个的词法单元,例如标识符、关键字、运算符等。Go编译器是一个多阶段的编译系统,它将Go源代码转换为可执行的机器码。Go编译器的工作原理。

2301_79326254的博客 372

为什么越来越多的人偏爱go语言

如果你是一个开发者或者程序员,你大概应该听过Go语言或者Golang语言。当然,如果没有听过也没关系,看到这篇文章的同学,就说明你对Golang是关注的,只需要这一点就够了。今天来聊聊关于Golang的几个问题。 越来越多人偏爱Go语言的真相 可能你身边有程序员朋友,或者技术论坛里有人在谈论Go或者Golang,引起了你的注意,让你觉得越来越多的人喜欢Go语言。 作为一名负责人的技术普及人员...

qfliweimin的博客 587

drone-golang:从 Drone.io 发布 golang 项目示例

用于 golang 的 Drone.io 这是从发布 golang 项目的。 获取源代码 运行测试 发送测试覆盖由 由交叉编译 通过二进制文件发布到 Github 发布 配置 在设置选项卡中的drone.io 中的命令上粘贴以下代码, COVERALLS_TOKEN在环境变量上设置GITHUB_TOKEN 、 COVERALLS_TOKEN : # Install go 1.3.1 pushd ~ / curl -s -o go.tar.gz https://storage.googleapis.com/golang/go1.3.1.linux-amd64.tar.gz tar xzf go.tar.gz export GOROOT= ~ /go export PATH= $GOROOT /bin: $PATH go version popd # Get source code

开启golang之旅

假如你对golang感兴趣, 却尚未开始入门, 这篇文章就是为你准备的.     为什么要学习golang? 游说开发者尝试golang的文章很多. 比如golang主要设计者的演讲, 某个德国人的吐槽, 国内golang布道者所著书籍的前言. 我不想重复一遍大牛们的观点, 只想说一说自己朴素的感受. 在学习golang之前, 我是java的爱好者, 犹如iteye的大多数用户一样. 是...

coolxing 204

PCIe链路训练Recovery状态机:从RcvrLock到链路稳定的关键路径

本文深入解析PCIe链路训练中的Recovery状态机,特别是RcvrLock状态的关键作用。从Block对齐、均衡预设值应用到状态转移条件,详细介绍了确保链路稳定的技术要点,并提供了高速率下的特殊处理方法和常见问题排查指南,帮助工程师解决PCIe链路不稳定问题。

weixin_28739079的博客 174

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

七牛云大数据平台建设实践

2017 年 1 月 14、15日,为期 2 天的 ECUG Con 十周年大会在深圳圆满结束,会上七牛云 CEO 许式伟做了题为《七牛大数据平台建设实践》的演讲,首次披露七牛云在大数据方向的产品思路,以下是对他本次的演讲实录。 许式伟 七牛云创始人、CEO从连接到智能我们都说现在是移动互联网时代,移动互联网时代我们随时随地能够上网,面向连接的革命诞生了很多有意思的应用,包括滴滴打车、外卖,这些...

七牛云——开发者的创新加速引擎 376

H3C VRF实验

POP-vpn-instance-RT1]route-distinguisher 11:11 # VPN实例-RT1的路由区分器值11:11。配置路由泄露,其实就是在一个VPN示例中添加另一个VPN实例的下一跳,比如在VPN实例RT1中添加去往SRV的默认路由。但是也有了一个新的问题,那就是RT1、RT2和RT3也能互访了,这让VPN实例变得没有意义了。[POP]ip vpn-instance RT1 #配置vpn实例-RT1。绑定了VPN实例,所以要把路由添加到VPN实例POP中。

m0_68698993的博客 4024

Go早期的那些布道者

Go自2009年开源至今已经快15年了[1]!这期间,有很多人对Go语言的发展做出了重要贡献,起到了至关重要的作用,他们被视为Go语言的早期布道者和鼓吹者。他们向Go社区传达着Go的价值观、Go的最新发展、Go的使用方法以及最佳实践。这些人有来自Go团队的,有来自Google但非Go团队的,也有Go的早期采纳者和贡献者。如今这些人的状况不尽相同。有些人依然在活跃在Go团队中,为Go的演进持续做着贡...

TonyBai 1508

华为昇腾910B3显卡实战:手把手教你部署DeepSeek 32B模型(含Bge-zh向量库配置)

本文详细介绍了在配备8张华为昇腾910B3显卡的服务器上,从零部署DeepSeek 32B大模型推理服务的完整实战方案。内容涵盖环境准备、模型配置、多卡负载分配,并集成了BGE中文向量模型与ChromaDB向量数据库,最终通过Open WebUI构建了可投入生产的企业级AI应用栈,为私有化大模型部署提供了具体参考。

weixin_29038345的博客 1709

【问题解决】本地 Llama / Qwen 运行报错:transformers 版本不兼容、依赖冲突解决

Flask是一个轻量级的Web框架,设计上非常简单和易于扩展。它并不强制使用任何特定的项目结构或工具,这使得开发者能够根据自己的需求自由地设计应用。Flask的灵活性使它成为了许多小型项目和原型开发的理想选择。FastAPI是一个现代的Web框架,基于Python 3.7+,专为构建API而设计。FastAPI的特点是高性能、支持异步操作,并且内置了许多现代Web应用所需的功能,如数据验证和自动生成API文档等。从性能角度看,FastAPI在高并发场景下具有明显优势,特别是在I/O密集型的应用中。

博客 800

GoLang之常见数据结构实现原理-map

GoLang之常见数据结构实现原理-map

weixin_52690231的博客 658

2025华为OD 面试手撕代码真题【字符串至多删除一个字符,是否能构成回文串】

2025华为OD 面试手撕代码真题【字符串至多删除一个字符,是否能构成回文串】

MISAYAONE的博客 1706

Go 语言创建者,大佬们的有趣的对话访谈

卡门(Carmen)和乔恩(Jon)与罗​​布·派克(Rob Pike)和罗伯特·格里塞梅尔(Robert Griesemer)(Go的创造者)讨论了它的起源,增长,影响力和未来。这是一部史诗般的剧集,深入探讨了Go语言的历史和细节,以及Go语言的方式和原因,以及他们在创建这种出色的编程语言过程中所做的选择。 卡门·安多(CARMEN ANDOH) 欢迎大家,去时间!今天我们为您举...

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 2562

windows 应用爬虫: exe自动操作

之前写了那么多关于手机和网页爬取,今天就写一期关于exe的爬取,exe的爬取其实也是类似的,一个方式是抓包,还有一个模拟人工界面获取元素数据。抓包肯定是最直接,数据也是最全的, 有些数据不一定会显示在界面上,或者必须通过一定交付方式,才能显示到页面(比如移动鼠标到具体元素上)。本文依旧采用python方式,先说说怎么通过界面方式驱动应用点击和数据获取。

youbingchen的博客 888

把 SAP Fiori Launchpad Designer 的 Catalog 与 Group 传输讲透:从 CONF、CUST 到 Transport Request 的完整理解

SAP Fiori项目中,catalog和group的传输问题往往源于对FLPD层次模型的理解不足。FLPD包含configuration(系统级)和customizing(客户端级)两个层面,分别对应workbench request和customizing request传输方式。常见误区包括:混淆/UI2/FLPD_CONF和/UI2/FLPD_CUST入口、未提前创建传输请求、不了解层次覆盖机制(customizing会覆盖configuration)。当客户端修改configuration层的对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 101

Drone 持续集成实践 - 基于 Gogs,以 Golang 为例

Drone 官方示例 - Example Go project 用 Docker 部署 Go 服务器 Golang 官方示例 - outyet 一个生产环境的例子 用 rsync 复制文件的方式进行部署的例子 实际的 DevOps 项目中,在 pipeline 流水线中包含下载代码、测试、构建、发布、部署、通知等步骤。基本流程如下,当然不同...

weixin_30502157的博客 944

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Go语言的创造者罗伯特·格瑞史莫的工作壮丽旅程

与此同时,他也积极参与Go语言社区的活动,如会议、讲座和讨论等,分享他的经验和见解,为Go语言的发展助力。除了在谷歌的工作之外,罗伯特·格瑞史莫还与其他编程专家合作撰写了多本关于Go语言的书籍,这些书籍为广大开发者提供了学习Go语言的资料和指导。他不仅致力于Go语言的发展和改进,还通过各种方式积极推动Go语言的普及和应用。他的工作对于Go语言的成功和全球开发者的福音来说都具有重要的意义。作为谷歌的一名资深工程师和Go语言的主要设计者之一,他在谷歌的工作状态一直保持着非常活跃和富有成效的状态。

guzhoumingyue的专栏 715

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[GO专栏-1]Go语言的前生今世

Go语言的前生今世Go 语言的诞生Go 语言的早期团队和演化历程Go 语言正式公布并开源Go 语言的版本结尾????点击直接资料领取???? Go 语言的诞生 2007年9月20日的下午,在谷歌山景城总部的一间办公室里,谷歌的大佬级程序员 Rob Pike1在等待一个 C++ 项目构建的过程中和谷歌的另外两个大佬级程序员 Robert Griesemer2和 Ken Thompson3进行了一次有关设计一门新编程语言的讨论。 图1-1-1 Go语言之父(从左到右分别是Robert Griesemer、Ro

苏州程序大白的博客 1082

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

“能力越大,责任越大” - Go语言之父详解将于Go 1.18发布的Go泛型

Go语言之父在2020.11.9~11.13举行的全球最具影响力的Go语言技术大会GopherCon 2020上,Go语言之父之一的Robert Griesemer为全世界Gopher们...

TonyBai 5469

golang使用七牛云oss对象存储进行文件上传

使用七牛云oss对象存储进行文件上传,以下是golang的demo

GrandeLai的博客 862

docker+drone+go自动部署

1、安装mysql自行安装 2、安装Gogs自行安装 3、安装drone/drone docker run -d\ --volume=/var/lib/drone:/data \ --env=DRONE_DEBUG=true\ --env=DRONE_LOGS_TRACE=true\ --env=DRONE_LOGS_DEBUG=true\ --env=DRONE_LOGS_PRETTY=true\ --env=DRONE_AGENTS_ENABLED=true \ --env=

qq_40743080的博客 1222

使用Docker安装Drone和Gogs实现自动化部署

Drone是基于GO语言开发的持续集成(Continuous integration,CI)引擎,它可以借助Docker容器技术,用于自动化测试与构建,满足持续交付的基本需求,适合小团队开发。Drone具有简洁、轻量级、启动快、资源占用等特点。Jenkins也是CI引擎,它的特点是文档丰富、功能丰富、插件丰富、配置功能强大等特点,但资源占用较高。Drone比Jenkins轻量级,对云原生支持较好。# 官方网址:Gogs是基于GO语言开发的代码仓库管理系统。

make_progress的博客 4241

他是世界上最杰出的程序员,一个月写了个操作系统,退休后去做飞行员!

大家好,我是阳哥。1983年,美国计算机协会将图灵奖授予肯·汤普森和与丹尼斯·里奇。获奖理由是:“For their development of generic operating systems theory and specifically for the implementation of the UNIX operating system.”翻译过来就是:“授予...

Python数据之道 460

golang对接七牛云,模块封装

【代码】golang对接七牛云,模块封装。

qq_42413441的博客 534
上一篇: 我为什么选择使用Go语言?
下一篇: 给Jquery动态添加的元素绑定事件
csdn265
博客等级 码龄11年 109粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值