IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 为什么 Go 语言把类型放在后面? -> 正文阅读

[Java知识库]为什么 Go 语言把类型放在后面?

大家好,我是煎鱼。

前段时间看到大家在吵一个话题,那就是 Go 语言的类型声明,抠知识抠的非常细了,就是为什么他要放在后面,展开了热烈的讨论。

示例代码如下:

var?a?[]string
var?b?[]string

其实在早年 Go 官方估计已经被问烦了,写过一篇《Go's Declaration Syntax[1]》来具体介绍和说明情况。

为此煎鱼将参考并结合这篇官方资料,带大家一起了解为什么 Go 如此的 “与众不同” ,为什么要把类型放在后面。

类型前置

在业内目前有不少知名语言,也采取的是在声明变量类型时,把类型定义在名字前面。像是 C、C++、C#、Java 等:

int?x;
int?x?=?100;

基本的格式定义:<data_type> <variable_list>;。

上面的声明是一个简单的例子,如果更复杂一些,Go 官方还给出了著名的函数指针的例子:

int?(*fp)(int?a,?int?b);

更进一步,如果返回值也是个函数指针类型,就会变成:

int?(*(*fp)(int?(*)(int,?int),?int))(int,?int)

这已经很难看出来是个 fp 的声明了。

类型后置

前面所举例的类型前置的编程语言,很多都是 C 系列中的一者。类型后置的代表,分别有:Go、Rust、Scala、Kotlin 等。

其实在很多类型后置的编程语言种,会采取变量名+冒号+类型的方式出现。就像 Rust 一样:

let?x:?i32;

基本的格式定义:

x:?int
p:?pointer?to?int
a:?array[3]?of?int

Go 官方参照了这类类型后置的设计,并且为了简洁,进一步去掉了冒号和一些关键字,变成:

var?a?[]string

我们再看回前面 fp 的声明的例子:

int?(*(*fp)(int?(*)(int,?int),?int))(int,?int)

再对比 Go 语言中就变成了:

f?func(func(int,int)?int,?int)?func(int,?int)?int

两者一对比,Go 语言代码可读性确实更高一些。

思考

后置类别

在类型声明上,实际上分为:变量类型后置、函数返回值后置。两者共同构建了前置还是后置,总不能一个前置,一个后置吧,那得多么的难受。

上方 C 语言和 Go 语言函数指针的例子,所对比带来的代码可读性提高,其实本质上是由函数返回值后置所带来的。

和类型前置、后置没太多直接关系。

核心思想

在类型后置上来讲,Go 官方核心思想是:这种声明方式(从左到右的风格)的一个优点是,当类型变得更加复杂时,它的效果非常好(One merit of this left-to-right style is how well it works as the types become more complex)。

Go 的变量名总是在前,在人的代码阅读上可以保持从左到右阅读,不需要像 C 语言一样在一大堆声明中用技巧找变量名对应的类型。

505420d613fbef5c07ad480314ce4faa.png
The Clockwise/Spiral Rule

为此甚至有人写了篇 C 语言的顺时针读法《The Clockwise/Spiral Rule[2]》,有兴趣可以阅读。

如此一对比,Go 语言的类型后置在复杂场景下与 C 语言的对比确实更好一些。

其他因素

类型推导

诸如在类型推导的形式上也会更直观:

func?main()?{
????var?s1?:=?"脑子进煎鱼了"
????var?s2?string
}

也是一个可读性提高的问题。

类型和名字谁更重要

不同设计者对谁更重要的理解也不一样。是类型更重要,还是名字更重要呢?

有的人认为是类型,有的人认为是名字。这就真的是千人千面,众口难调了。

C# 的后悔

我们看看其他语言,C# 设计组成员之一,其实在《Sharp Regrets: Top 10 Worst C# Features[3]》中的第五点表达了个人对类型前置、后置的设计教训。

61cbcd0641347bd4a9bb0d603de30725.png

核心观点是:从编程和数学两方面来看,都有一个约定,即计算的结果在右侧表示,所以在类 C 语言中,类型在左侧是很奇怪的。

在设计时,C# 本来计划把类型注释放在右边。但考虑到类 C 语言,因此遵循了其他语言的惯例。

总结

实际上该问题的研讨,在 2021 年的现在,大部分 case 都一一被反驳了。类型后置也不是一个与众不同的设计,很多语言都是如此。但既然要讨论 Go 语言,那更多的是站在设计者的角度去考虑

结合 Go 所提供的官方资料,在当年的目的更多的是为了在遇到复杂类型定义时,能保持一定的代码可读性

当然,这不可否认肯定包含 Go 开发团队的主观意识。有兴趣的可以具体挖挖背后的信息。

如果是你,你会希望类型放在前面,还是后面呢,为什么?

参考资料

[1]

Go's Declaration Syntax: https://go.dev/blog/declaration-syntax

[2]

The Clockwise/Spiral Rule: http://c-faq.com/decl/spiral.anderson.html

[3]

Sharp Regrets: Top 10 Worst C# Features: https://www.informit.com/articles/article.aspx?p=2425867

关注煎鱼,吸取他的知识?👆

c8da9ba7c4cb32bc54ac7ce484b4b0b0.png

你好,我是煎鱼。高一折腾过前端,参加过国赛拿了奖,大学搞过 PHP。现在整 Go,在公司负责微服务架构等相关工作推进和研发。

从大学开始靠自己赚生活费和学费,到出版 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,记得点赞!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-14 12:45:25  更:2021-10-14 12:45:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:05:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码