本文的观点,你认同吗?

出于好奇,我最近开始接触一些 Go 的代码。我之前对它有一些了解,但是从来没有尝试去写(没有需求)。但是现在我们团队选择使用 Go 来开发一个项目,所以我觉得这是一个获得实际经验的好机会。

到目前为止,关于这门语言我已经学习了很长时间。在这个博文的末尾,我会写更多关于 Go 的干货。

社区实际上并不那么令人愉快,特别是那些因为它的简单性而主张使用 Go 的人。似乎简单已经成为 Go 社区中的一个流行语,许多人反复重复提到这点,却没有给出太多实际的想法。

这对我来说似乎很不幸,因为在我看来,Go 是一个“极其简单的语言”:

  1. 不应该作为考虑使用 Go 的主要原因
  2. 从他们的关注点中找到其他更有利的推荐理由
  3. 甚至不是真的(不是真的简单)

在这篇文章中,我想围绕 Go 来分析一些简单观点。

在深入之前,我想强调一件事情:这篇文章并不是对 Go 的批评,而是一种对 Go 的宣传和倡导的方式。有时候,我可能会批评这个语言的某个方面,但这不是我们关注的重点,我只会试图用一种非正式的、事实的,每种语言都会涉及的方式来讲述。

我来自哪里

出于工作和业余爱好,我同时使用多种编程语言。我不赞成有“最喜欢的语言”的概念。过去我曾经有过一些最喜欢的语言,但这种认识往往是一时的情感,随着时间推移,会发生变化。

在我的工作中,我使用 C++ 和 Python 写大型服务的后端代码。过去我曾经在一个你可能知道的操作系统上工作,而且我也做了嵌入式工作。在业余项目中,我做了其他各种事情。

我并不是夸耀什么(我不是一个专家),我只是想表明,我在编程的许多领域至少有一些见解,而且我一直努力保持开放的心态。

所以,不要着急,让我们开始讨论正题,看看几个观点。

1. “与主流语言相比,Go 的关键字非常少”

我从一个最常见的例子开始。当推广 Go 时,这会是大家的口头禅。

首先,即使它是真实的,我不知道为什么关键字数量会是判断一个语言的学习曲线或复杂性的重要依据。当然,如果有成千上万的关键字,这可能是一个问题。但是大多数语言最多只有几十个关键字,这种规模下,关键字的多少是无关紧要的。

我还没有听到有人因为关键字的数量而抱怨某门语言

其次,Go 所谓的“很少”的关键字实际上只不过是一个聪明律师的伎俩(也许,我甚至会认为这是 Go 的虚假广告)。Go 规范 列出了 25 个关键字,这的确比大多数语言要少些。但在我看来,Go 并没有比其他语言关键字表示更少的概念,Go 虽然没有这些关键字,但相应的概念依然是语言的一部分(即实际的复杂性保持不变)。

为了说明我的意思,请考虑一个 while 循环。 Go 没有这个关键字,这是真的,但它仍然有一个 while 循环,文档甚至是这样说的,它的目的只是重用其他关键字。

另一个这样的例子是 private 和 public。 Go 没有这些关键字,但它仍然有 private 和 public,它只是使用字母大小写而不是关键字。

用来删减关键字的另一个技巧叫 预定义标识符(Predeclared identifiers),在技术上它不是关键字,但是在实践中仍然需要它们,创建一个和它同名的变量仍然不是一个好主意,因此,最后看来...它们基本上是关键字。此外,其中一些预定义标识符是其他语言的关键字,因此仅将它们与 Go 的关键字列表进行比较是非常不公平的。就像苹果和桔子。

2. 接收者参数

接受者参数对我来说有些古怪。看起来 Go 似乎并不建议使用 this 和 self,但是仍然需要方法,所以就存在 “接收者参数”,除了方法签名看上去很奇怪之外,它们基本上是一样的。

接收者参数有一个问题,当访问一个方法时,我需要知道接收者参数(这是任意的)的名称,以明确这个方法的作用。因为缺少关键字(译注:如 this),语法高亮成为一个问题。(看吧?这是如何减少关键字实际上使事情变得更加复杂的例子。)这有点像 C++ 中的隐式 this。

这里有一个新人容易混淆的例子

恕我直言,最简单、最直接的方式来表达一个接收器是 UFCS,而不是 C++ 或 Go 的方式。但就像我说的,我不是在抱怨 Go,我真的不介意接受者参数的观点(如果我忍受不了 C++ 的怪异,我可以忍受 Go 的)。

3. 函数返回值

如果接收参数不够,函数甚至能够通过各种形式的返回值来声明。通常语言允许你通过 return 语句返回函数中的一个值。而在 Go 语言中,你可以返回多个值(我认为可以用更优雅的方式通过元组来解决,但是就这样吧)。除此之外,还有命名返回值。在我看来,并不是一个好主意,因为它允许我们在那些很难找到返回值的地方写上晕头转向的代码。结合接收方参数,您可以创建这样的函数签名:

func (f Foobar) Something(a int, b int, c int) (foo int, bar int) { // ...}

这是有效的 Go 代码。如您所见,有三个参数。我真的不希望任何人试图选择这个“简单”,因为这个语法除了简单,什么也不是。

4. “没有继承”

Go(或许只是社区)似乎很反对“传统的 OOP”(不管这是指哪个,可能是 Java 或者 C++),我记得有人说 Go 没有继承是一件好事。

除此之外,Go 有一个功能叫做嵌入,这个文档以及一些博客文章声称 Go 没有继承。我试着用各种方式使用它,我没法认为 Go 反对继承。上面链接的文档说:

还有种区分内嵌与子类的重要手段。当内嵌一个类型时,该类型的方法会成为外部类型的方法,但当它们被调用时,该方法的接收者是内部类型,而非外部的。

有差别吗?继承通常以相同的方式工作,继承的方法也对内部类型起作用。

在我看来,在 Go 中,真正唯一不同的是,多态性从结构中解耦。你需要使用接口来使用多态性。但一旦你做了,做的事情和传统的 OOP 非常相似,包括方法覆盖 - 这里是个演示

关于 Go,有件事令我很惊讶 —— 这门所谓简单的语言 —— 你甚至可以实现多重继承。确实很糟糕。 golang-nut 的邮件列表中,有人提到,Go 并不能很好的处理继承的歧义。我已经调整了其中提及的代码,以便它展示了著名的“可怕的钻石问题”(Dreaded diamond problem):

package mainimport "fmt"type T1 struct { T2 T3}type T2 struct { T4 foo int}type T3 struct { T4}type T4 struct { foo int}func main() { t2 := T2{ T4{ 9000 }, 2 } t3 := T3{ T4{ 3 } } fmt.Printf("foo=%d

go 函数末尾缺少返回值_伙计们,Go 并没有那么简单?你觉得呢相关推荐

  1. dapper 调用 存储过程返回值_数据库事务、存储过程、函数以及触发器之间的区别和联系...

    一.[事务概念] 事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行. 1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前 ...

  2. ostream作为函数返回值_函数的调用(一)

    函数作为计算机代码的一种抽象方式,它的作用不言而喻! 原文链接 认识函数: 定义:函数是一段代码的表示,是一段具有特定功能的,可重用的语句组 函数是一种功能的抽象,一般函数表达特定功能 两个作用:降低 ...

  3. Python基础学习_函数数def_返回值及返回值类型_函数块

    一. 返回值 函数作用:显示输出.处理数据并返回数据结果 函数返回值的定义:函数返回值被称为返回值 写法: 函数体内 return 返回值 (将值返回到调用函数的代码行) 返回值类型: "& ...

  4. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  5. Python教程:函数多个返回值与丢弃返回值

    1.函数多个返回值 python的函数支持返回多个值.返回多个值时,默认以tuple的方式返回. 例如,下面两个函数的定义是完全等价的. def f():return 1,2def f():retur ...

  6. python函数返回值和参数_python_函数参数和返回值

    01.函数参数和返回值的作用 函数:封装功能独立的代码,在需要时通过函数名调用,可以直接访问全局变量 参数:外界希望在函数内部处理数据 返回值:向外界报告函数的执行结果 定义函数时, 是否接受参数,或 ...

  7. C++ 函数的引用返回值

    C++ 函数的引用返回值 2009-09-17 09:29 引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递.它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数 ...

  8. python函数参数定义顺序_Python函数定义-位置参数-返回值

    原标题:Python函数定义-位置参数-返回值 1 函数介绍 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多 ...

  9. jsonp react 获取返回值_必须要会的 50 个React 面试题(下)

    翻译:疯狂的技术宅 原文:https://www.edureka.co/blog/interview-questions/react-interview-questions 29. 你对受控组件和非受 ...

最新文章

  1. 买电脑怎么看配置_电脑配置怎么选?
  2. 什么叫编译时和运行时
  3. 函数模块:POPUP_TO_INFORM
  4. java方法怎么写_关于java方法,这几题该怎么写
  5. django的admin管理后台到底是否靠谱呢
  6. uclinux 嵌入式linux,嵌入式操作系统uCLinux
  7. centos7.2 开发 部署 .net core
  8. 缺少更新或刷新的键列信息_涨知识 | 刷新键究竟是用来干嘛的?你为什么要点击刷新呢?...
  9. (附源码)springboot自律健身房会员管理系统 毕业设计456466
  10. Eucalyptus学习汇总
  11. 高中计算机高考时vb试题,高中信息技术vb试题及答案
  12. IT30: 30岁IT人CTOCIO职业生涯探讨(2009-2013)
  13. pcr计算码率的过程
  14. POJ1555-Polynomial Showdown
  15. 技术干货 | MindSpore AI科学计算系列(五):AI框架加速海洋数值模拟
  16. 使用uni-app把h5网页封装成app
  17. 支持英特尔9242的服务器,宝德2U双子星服务器PR2725TP2
  18. C语言教程(四):基础知识(最后一续)
  19. 网页开发的一些尺寸单位
  20. 微信公众号开发(一)服务器及接口的配置

热门文章

  1. 计算机换汉语快捷键,电脑常用快捷键
  2. ECshop sina
  3. mysql c函数大全_Mysql 函数大全
  4. 三维点云学习(4)5-DBSCNA python 复现-1- 距离矩阵法
  5. Lync Server 2013企业版部署系列之一:部署环境介绍
  6. 你知道关闭页面时怎么向后台发送消息吗?
  7. 批量图片处理,打包成zip
  8. 给入门级程序员的忠告
  9. SQL那些事儿(十)--oracle主键、唯一键与索引
  10. ArcGIS水文分析实战教程(14)提取水库湖泊等面状水系