第一百一十七期:爱上 Go 语言的10个理由
这个月 Go 语言就将迎来它的10岁生日了,于是我们特地列出了10条让你可以开心使用 Go 语言的理由。
作者:4bytes
这个月 Go 语言就将迎来它的10岁生日了,于是我们特地列出了10条让你可以开心使用 Go 语言的理由。
Map 集合/映射默认使用0值
在 Go 中使用映射时,即使你尚未为特定的键插入任何值,也可以查询该键,并且它所对应的值为0还不是nil,除非存储的是指针。
因此如果你有这样一个映射 m:=map[string]int然后你想得到 m["hello"],返回的结果将是 0,即使该位置并没有值。
这允许我们写代码时不需要再检查该键是否存在,从而使代码更加整洁。想象如果我们想要保存某个字符串中一个字符出现的频率,我们只需要这样做:
- func count(input string) (map[string]int) { m := map[string]int{}for _,s := range input { m[string(s)]++ // 这一步永远都会是安全的}return m}
上面的代码中,我们无需在递增之前事先判断该键是否已经有值。
不变值
默认情况下,当向一个方法或者函数传递值时,你无法对它进行更改。当你确实需要更改这个值时,你需要向这个值传递一个指针。它不像 Rust 那么严格,后者在初始化变量时就需要标记它是可变变量。尽管如此,这仍然意味着如果你调用了一个不接收指针的函数,你可以确定它不会和你的结构所混淆。
值默认不会是 nil
不管在哪种语言里,我都不是很喜欢 Null,因此我很高兴在 Go 里,默认情况下你的结构或者基本类型绝对不会指向 Nil,这就消除了错误检查——当然有一个例外,就是在使用指针的情况下,因此在此情况中我们应该有错误处理机制。就算是 Tony Hoare 这个发明了 Null的人也曾经将它形容为一个“价值百万美元的错误”。
- type myStruct struct{}func magic(m myStruct) {// 无指针,此情况下不会出现 Nil}func magicp(m *myStruct) {// 可能出现空指针!}
Nil 切片 == 空切片
是的,这一点再次和 Nil 相关,因为我真的很不喜欢 Nil 值。所以另一个让我爱上 Go 语言的原因就是如果你有一个 nil 切片,它和一个空切片其实没什么区别,因此你就不需要分开判断一个切片是否为 nil然后再判断它是否为 empty。刚好这也是我喜欢 Common Lisp 的理由之一,当时我很意外 Go 语言也能有这个功能。
- func main() {var s []intif len(s) == 0{ fmt.Println("hello")}}
轻松发布相关库
在知道 Go 语言中发布库有多么容易之前,我好像从来就没意识到这件事的重要性。我自己写了一些 Go 库,而我唯一需要做的事就是把它们 push 到 GitHub 上,之后别人可以直接在项目中引用这个项目 gogetgithub.com/4byte/{lib}。现在你也可以把它们添加成 go模块,但这和往 GitHub 上发布库一样简单。
Go 拥有强烈的语法偏好
强制代码格式这一点有人喜欢就有人讨厌,但 Go 确实是一门有着强烈语法偏好的语言。个人而言我很喜欢它的风格,因为在代码审查上它移除了很多没用的部分。借 Rob Pike 的原话:
Gofmt 不会是某个人的最爱,但它也是每个人的最爱。
多范式编程
你所看到的很多 Go 代码都是偏向面向对象型的,但它不一定非得是面向对象。实际上,尽管 Go 在一些地方缺少某些语法和功能,但 Go 其实是可以成为一门不错的函数式编程语言的。举个例子,Go 语言可以满足柯里化(Function Currying)或者延续传递 CPS 风格的编程。
虽然你不一定要让整个代码库都呈现函数式编程的风格,但在项目中的某些部分可以用到它。
Go 社区
不管是在 IRC 上的 freenode/go-nuts还是在 gophers.slack.com上你都能找到很多真正关心着这门语言的开发者。并且这些社区对刚刚转向 Go 的新人都很友好。更拉好感的是,Go 社区在多样性和包容性上做出了很大努力,比如 Git 上的 GoBridge 项目和"Women Who Go"项目等。
处处运行
Go 基本上在哪里都能运行,并且只要能提供正确的 GOOS,GOARCH,CGO_ENABLED 或 GOARM 标记等,你可以在任何平台上构建它。这使 Go 也得以在多种架构上运行,比如 amd64,386 和 arm 等。
除开这些,Go 也是第一门拥有内置 WebAssembly 的语言。除了这些已经能支持的平台外,还有类似 TinyGo 这样的项目在推进 Go 更强大的跨平台型和便携性。
Go 被特意设计为一门简单的语言
Go 从诞生之初就以简单性为目标,到目前位置,它的简单性保持得会很成功。Go 的语言规范是你从头到尾看一遍(花不了多少时间)就能完全看懂的东西,这也意味着有些在别的语言中能够找到的特性在 Go 里它就是不存在的,其中一个争议比较大的就是 Go 缺少泛型。
我个人非常支持 Go 语言的这种简单性,它的好处之一就是让开发者可以迅速掌握该语言,而在一个团队中也几乎不会出现这种你的同事使用了你从未见过的程序结构的可能。
阅读目录(置顶)(长期更新计算机领域知识)
阅读目录(置顶)(长期更新计算机领域知识)
阅读目录(置顶)(长期科技领域知识)
歌谣带你看java面试题
第一百一十七期:爱上 Go 语言的10个理由相关推荐
- 第一百一十期:详解SpringBoot应用跨域访问解决方案
说到跨域访问,必须先解释一个名词:同源策略.所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同.Host(ip)相同.端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问 ...
- Swift成为主流语言的10个理由
是时候使用易入手又全面的Swif语言为iOS和mac OS X做应用开发了. 虽然编程语言不会那么容易消逝,但坚持衰落范例的开发小组正在这么做.如果你正为移动设备开发应用程序,并且你还没有研究Swif ...
- 【eoe特刊】第二十七期 OpenGL ES学习及项目解析
经过一个月征稿.编辑,新的一版特刊终于出炉了. 本次特刊的制作,改变以往的制作方式,完全取自网友的独自的风格. 在只有一个主题的前提下,完全是通过社区的热心的网友,根据自己的想法,自行设计,自由发挥, ...
- 开发者论坛一周精粹(第十七期) :【漏洞预警】Windows再被爆SMB服务0day漏洞,阿里云提示您关注并修复...
第十七期(2017年7月31日-2017年8月6日 ) 在美国拉斯维加斯举行的2017年度DEF CON黑客大会上,安全研究人员公布了Windows系统上的一个长达20年没有发现的漏洞,该漏洞名为&q ...
- 鲁大师电动车智能化测评报告第十七期:电动车产品的同质化困局
鲁大师第十七期智能化电动车测评排行榜数据来源于鲁大师智慧实验室,测评的车型均为市面上主流品牌的主流车型.截止目前,鲁大师智能化电动车测评的车型高达90余种,且还在不断增加和丰富中. 1. 测评依据 鲁 ...
- 美学心得(第二百一十七集) 罗国正 (2020年12月)
美学心得(第二百一十七集) 罗国正 (2020年12月) 2957.我有闲时,找些好诗来读读,并细看诗歌的注释,既是一种美的享受,增长很多语言文化.历史等知识,还经常令我心潮激荡.然后,根据诗的意境和 ...
- Python 一种接触就容易爱上的语言一
Python是一种接触了就特别容易爱上的语言,把极简发挥到了极致. 基本上只有能偷懒的地方,Python 都实现了偷懒.例如在框架Beautiful Soup 框架中直接把常用的find_all省略了 ...
- 第一章 c语言概述程序逻辑,第一章 程序逻辑与C语言概述
1.第一章 程序逻辑与C语言概述,1.1 C语言概述1.2 程序和程序逻辑,第一章 程序逻辑与C语言概述,1.1 C语言概述,[学习目标]了解C语言工作机制掌握C语言程序的的基本构成了解C语言程序的编 ...
- Oracle数据库管理每周一例-第十七期 ADG
Oracle数据库管理每周一例(12.2,18c,19c) 2020-10-16 第十七期 ADG 1.概念 2.环境说明 3.搭建流程-主库处理 1.配置静态监听 2.配置本地命名 3.数据库参数配 ...
最新文章
- 正则表达式了解和使用
- Linux系统编程——线程私有数据
- 图片转圈实现_如何编辑图片?
- Ubuntu18.04 显卡驱动安装
- Linux block
- 服务器和客户端Socket单向通信例子
- [IE 技巧] 输入错误网址自动转到搜索引擎的功能选项
- 用matlab求三重积分格式,matlab求三重积分
- Node.JS 字符分割
- xp启用计算机共享打印机,xp系统和win7系统怎么共享打印机_xp如何连接 win7共享打印机...
- 台式计算机的显卡,台式电脑显卡天梯图-台式机显卡性能排名
- CSMA/CD 简要介绍
- strut2 表单标签
- matlab 怎麼卸載乾淨,matlab set gca用法
- git仓库创建及上传
- 利用python提取图像轮廓
- 【用例怎么评审?,评审哪些内容?】
- 磁盘的FAT,NTFS,exFAT等格式
- C程序设计语言——VC++2010安装教程
- LCD的poll和vcom的反馈调节
热门文章
- [转载]用c写PHP的扩展接口(php5,c++)
- pytdx 获取板块指数_能否增加一个通过股票代码,板块指数代码获得中文名称的接口?...
- jq金钱如何加千分位_拼多多如何玩转场景推广
- wsl2 Ubuntu 18.04 安装 ROS
- Github git 命令下载加速
- Android 基础 —— 模拟实现拨打电话功能
- .idl与.odl的区别
- undefined reference to
- [react] 说说你对reader的context的理解
- 前端学习(3279):循环 遍历 2