第一百一十七期:爱上 Go 语言的10个理由

这个月 Go 语言就将迎来它的10岁生日了,于是我们特地列出了10条让你可以开心使用 Go 语言的理由。

作者:4bytes

这个月 Go 语言就将迎来它的10岁生日了,于是我们特地列出了10条让你可以开心使用 Go 语言的理由。

Map 集合/映射默认使用0值

在 Go 中使用映射时,即使你尚未为特定的键插入任何值,也可以查询该键,并且它所对应的值为0还不是nil,除非存储的是指针。

因此如果你有这样一个映射 m:=map[string]int然后你想得到 m["hello"],返回的结果将是 0,即使该位置并没有值。

这允许我们写代码时不需要再检查该键是否存在,从而使代码更加整洁。想象如果我们想要保存某个字符串中一个字符出现的频率,我们只需要这样做:

 
  1. 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的人也曾经将它形容为一个“价值百万美元的错误”。

 
  1. type myStruct struct{}func magic(m myStruct) {// 无指针,此情况下不会出现 Nil}func magicp(m *myStruct) {// 可能出现空指针!} 

Nil 切片 == 空切片

是的,这一点再次和 Nil 相关,因为我真的很不喜欢 Nil 值。所以另一个让我爱上 Go 语言的原因就是如果你有一个 nil 切片,它和一个空切片其实没什么区别,因此你就不需要分开判断一个切片是否为 nil然后再判断它是否为 empty。刚好这也是我喜欢 Common Lisp 的理由之一,当时我很意外 Go 语言也能有这个功能。

 
  1. 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面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nhibernate.hbm2ddl.auto配置详解

hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下&#xff1a; <properties><property name"hibernate.show_sql" value"true" /> <property name"hibernate.hbm2ddl.auto" value"create" /></prop…

1048. Longest String Chain

文章目录1题目理解2 动态规划1题目理解 输入&#xff1a;字符串数组words&#xff0c;字符串只包含小写字母 规则&#xff1a;对于word1和word2&#xff0c;如果在word1中任何一个位置添加一个字符能够得到word2&#xff0c;那么可以称word1为word2的前身。词链是单词 [word_1…

第一百一十八期:运行 JavaScript 代码片段的 20 种工具

运行 JavaScript 代码片段的 20 种工具 前端日常开发中&#xff0c;我们使用喜爱的 IDE 调试 JavaScript 代码&#xff0c;比如我喜欢的代码编辑器有两个&#xff0c;Sublime Text 3 和 VS Code&#xff0c;前几年还使用过 Atom&#xff0c;偶尔我们会遇到临时需要快速分享给同…

如何建立好的索引.--针对Distinct

SQL语句SELECT DISTINCT EDOWN,EDOPT FROM EMFLIB.EQEDIPF WHERE EDCHK1 AND EDCHK2M AND EDCHK3 AND EDCHK4 AND EDTAG2数据库记录总数 1518741条符合查询的记录数 657225条最早的索引 EDCHK1 EDCHK2 EDCHK3 EDCHK4 EDTAG2 EDERRCODE消耗的时间:1分钟左右为什么呢?主要的原因…

一年总结

从九月份开学到现在为止&#xff0c;将近一年的学习结束&#xff0c;做一下简要总结&#xff0c;记录一下这一年的收获。这将近一年的生活&#xff08;除去上课时间&#xff09;可以用几个单词概括。吃饭->实验室->例会&#xff08;每周一次&#xff09;->看代码->…

140. Word Break II

文章目录1 题目理解2 回溯记忆化1 题目理解 140与130的区别是&#xff0c;当字符串可分的时候&#xff0c;要求返回具体的分割字符串。 2 回溯记忆化 对于字符串s&#xff0c;如果前面一部分是单词列表中的词&#xff0c;则拆分出这个单词&#xff0c;右边的继续分割。 分割…

spring mvc学习(25):Eclipse设置代码自动提示

Eclipse只需几步简单的设置就可以像idea那样代码自动提示了&#xff0c;喜欢的小伙伴可以赶紧动手设置&#xff0c;提升效率。 第一步&#xff1a;打开Eclipse --> Window --> Preferences 第二步&#xff1a;点击Java --> 打开Editor --> 点击Content Assist 第…

打破牢笼,展望更高层次的世界

打破牢笼&#xff0c;展望更高层次的世界--------------------------------------------------------------笔者袁永福是一个十多年的老程序猿&#xff0c;一穷二白的出来创业多年&#xff0c;期间经历许多曲折和磨难&#xff0c;成功的在炮火连天的商业战场上活了下来&#xf…

spring mvc学习(26):处理数据模型--从表单到controller传输数据

创建maven项目就不说了&#xff0c;需要的找我前面的博客 pom.xml文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

第一课 回归问题与应用

本系列是七月算法机器学习课程笔记 文章目录1 不同类型的学习2 基本术语与概念3 线性回归模型3.1 什么是线性回归3.2 损失函数3.3 最小化损失函数-梯度下降3.4 学习率有什么影响3.5 过拟合与欠拟合4 逻辑回归4.1 为什么要有逻辑回归4.2 什么是逻辑回归4.3决策边界线性边界判定非…

[推荐] TechNet 广播 SQL Server 2000完结篇

TechNet中文网络广播在之前已经推出了SQL Server 2000的基础系列和管理专家系列&#xff0c;使广大听众认识并掌握了SQL Server 2000的管理技巧。本次系列作为前两次系列课程的完结篇&#xff0c;将会从性能调优及维护的角度为广大听众提供了一道实用而精致的大餐&#xff0c;本…

spring mvc学习(28):get乱码解决

get请求乱码情况 编写一个RegistServlet处理用户的Get请求数据 View Code 运行结果发现输入中文提交后显示结果为乱码&#xff1a; jsp页面中 <meta http-equiv"content-type" content"text/html; charsetUTF-8">通知浏览器以utf-8解码 get请求…

第二课 决策树与随机森林

本系列是七月算法机器学习课程笔记 文章目录1 从LR到决策树1.1 决策树1.2 决策树的终止条件1.3 决策树划分依据1.3.1 信息熵1.3.2 信息增益1.3.3 ID3模型1.3.4 信息增益率1.3.5 基尼指数1.3.6 信息熵与基尼指数1.3.7 连续值属性2 回归树2.1 回归树构建方法3 从决策树到随机森林…

在ASP.NET中自动给URL地址加上超链接(好东东)

首先&#xff0c;要想在ASP.NET(C#)中使用正则表达式就必须把 System.Text.RegularExpressions 这个命名空间包含进来&#xff1a; using System.Text.RegularExpressions; 第二步是用正则表达式识别URL超链接&#xff1a; Regex urlregex new Regex("(http:\/\/([\w.]\/…

android apk 反编译

Apk文件结构  apk文件实际是一个zip压缩包&#xff0c;可以通过解压缩工具解开。以下是我们用zip解开helloworld.apk文件后看到的内容。可以看到其结构跟新建立的工程结构有些类似。java代码&#xff1a; |-- AndroidManifest.xml |-- META-INF | |-- CERT.RSA | |-- CERT.SF…

spring mvc学习(27):处理数据模型--从表单到controller传输数据续

创建maven项目就不说了&#xff0c;需要的找我前面的博客 pom.xml文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

第三课 SVM

本系列是七月算法机器学习课程笔记 文章目录1 问题2 key idea 13 key idea 24 key idea 35 key idea46 拉格朗日乘子求解7 核函数的发现学习SVM不要先看数学公式&#xff0c;这样把SVM的精华都丢掉了。学习SVM学习作者是如何构建出这样一个算法的过程。1 问题 无论线性分类、逻…

百度新闻的索引机制(二):智能聚类

百度新闻的索引机制(二)&#xff1a;智能聚类http://net.chinabyte.com/377/2520877.shtml 转载于:https://www.cnblogs.com/cy163/archive/2006/09/23/512337.html

spring mvc学习(29):modelandview向页面传输数据

创建maven项目就不说了&#xff0c;需要的找我前面的博客 pom.xml文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

C#远程开机

http://tryios.com/article/473.aspx C#远程开机 http://baike.baidu.com/view/1965454.htm 远程开机 http://www.cnblogs.com/whssunboy/archive/2007/12/05/984059.html C# 远程唤醒转载于:https://www.cnblogs.com/jacktang/articles/3309258.html