我有关编程语言的一点理解

副标题:[golang] 当用到一知半解的Go丢掉了大半年之后如何又能快速捡起

如题。

在这之后 [dev][go] 入门Golang都需要了解什么 便再没有接触过Go语言,以致今日便忘得一干二净。

现在要用,那么接下来的问题就是。我应该以一种怎么样的思路,将它拾起来。

[classic_tong @  https:////www.cnblogs.com/hugetong/p/12301487.html

一一

在我这,对编程语言的认知,无外乎便是以下这样的划分。

分类是这样:面向过程,面向对象,面向函数。集合是这样:c,c++,java,python,bash,go,lisp,haskell

html,js。

html和js是面向转有场景的,这里排除。面向函数是个人兴趣,工作中也不能用,同样排除。

余下的便是,在我面对具体要解决问题是,可以挑选的几种方式:面向过程、面向对象;C,java,python,bash,go这么几个选择。

C++也被排除,因为从我的角度,单就产出结果(性能优势)来说,GO完全能够将其覆盖。

一二

我们知道,一般的软件工程方法包括如下阶段:需求分析,概要设计,详细设计,实现,测试。

这么几个阶段。(一)中提到的这个选择,很显然是在“实现”开始的时候才会出现的。

而当这个选择出现的时候,其实我们已经决定了是面向过程还是面向对象。因为在概要设计阶段

我们便已经知道了解决问题的方法,决定了解决问题的逻辑。逻辑才是整件事情的核心。

一三

逻辑。面向过程就是决策树。面向对象就是本体论。(而面向函数就是(数学方法?),面向函数即是封装,面向对象也是封装,

所以面向对象的本质也可以化解为面向函数。接下来再讨论下去,引出的将是本体论与lamada验算之间的哲学关系,而这

已经超出了本文的讨论范围,当然也超出了我的能力范围。)

编程语言就是用来精准描述以上逻辑的工具。描述是为了记录,阅读,运行。运行也是阅读,是计算机在阅读。

一段程序,写出来主要是为了给人看的,偶尔拿到机器上跑跑。

于是,一个程序语言必须有能够达到以上描述要求的语法。(当然,计算机科学的大厦都是从0,1构建出来了,你当然可以基于基本语法来

表达复杂的事情,本文的表达排除了对这个问题的讨论。)比如bash,C来表达面向对象就不是一个好的决定。

一四

当一门语言渴望表达面向过程的逻辑时,它需要具备以下几个特性:类型抽象,数据存储(变量),判断,跳转(循环);此外为了可读性,

还应该有函数封装。(有了函数封装自然也有了递归,但是我们这里不讨论递归,或者说我没有能力讨论递归。)

当一门语言渴望表达面向对象的逻辑时,它需要具备以下几个特性:面向过程的特性(上一段),封装,继承,多态。

二一

第一节讲了那么多毫无关系的事情,接下来终于可以谈到GO了,以及面对重新捡起GO这个问题时,我该如何思考。

二二

基于以上的内容,我只需要回忆起,以下要点在Go语言中如何表达即可,他们是:

第一部分:类型,变量,判断,循环,函数定义;第二部分:封装性,继承,多肽。

以及第三部分:环境有关,运行,编译,部署,以及编辑效率提高(VIM,EMACS的高亮跳转等)。

第一部分

只需要阅读:https://golang.org/ref/spec, 虽说是官方的严谨spec,但是说实话,可读性极其差。请自行百度一段随便的

中文文档看看就好。

第二部分

https://code.tutsplus.com/zh-hans/tutorials/lets-go-object-oriented-programming-in-golang--cms-26540

这个链接非常值得读。我要的问题的答案,可以非常简答的罗列如下:

封装性:基于文件进行封装,文件也对应着包的概念(package)

继承:使用结构体匿名成员。

多肽:使用interface类型。加个new方法,返回interface类型

(另外加个题外话,还有模版(泛型编程),突然想到C++中的模版类。模版就是对强类型语言的弱类型化处理。在强类型语言中,执行函数调用

的时候,参数的数据类型对于不同函数调用都是固定设置好的约束条件。模版要做的恰恰便是把约束条件参数化,使其变成函数的入参之一。)

第三部分

这个问题,对于我来说,从来就不是问题。见

 [daily][emacs][go] 配置emacs go-mode的编辑环境以及环境变量问题

另外,这里有特好的一本小书:https://www.openmymind.net/assets/go/go.pdf

 [classic_tong @  https:////www.cnblogs.com/hugetong/p/12301487.html

------

------ comment @ 20200214 -----

反射

表面上,这篇文字是在讲golang。实际上是在讲我在编程语言这个件事里边构建出来的宇宙观。

我的经历存在局限(用了太多年的c),我的宇宙自然也存在局限。

反射(reflection)就是我的局限。golang是支持反射的,就像很多高级语言一样,比如java。

在我目前肤浅的理解里,反射可以与模版放置在同一个角度进行理解。模版是关于函数调用方式的扩展,将“类型”也作为了函数的操作对象进行op。

同理,反射是对决策树进行的扩展。或者说是对判断,跳转两个操作进行的扩展。以前他们的操作对象都是变量的值。有了反射之后,他们的操作

对象丰富到了变量的类型。

这便是我对反射的浅显理解。下边是两篇很好的文章,有助于golong实践中对反射的实操。

https://juejin.im/post/5a75a4fb5188257a82110544

https://learnku.com/articles/25154

-------- comment @ 20200215 -----------

泛型

泛型就是上文提到的模版,就是function的“type parameters”,就是“generics”。

就是:关于函数调用方式的扩展,将“类型”也作为了函数的操作对象进行op。

通读手册之后,我们知道Golang不支持泛型。并有如下佐证:https://zhuanlan.zhihu.com/p/74525591

不过以上讲的是GO 1,值得庆幸的是在GO 2中,我们将得到它对泛型的支持。

https://www.v2ex.com/t/586795

https://go.googlesource.com/proposal/+/4a54a00950b56dd0096482d0edae46969d7432a6/design/go2draft-contracts.md

https://blog.golang.org/why-generics

-------- comment @ 20200222 -------

这个继承的例子写的挺好的。

https://www.jianshu.com/p/150523db21a9

原文地址:https://www.cnblogs.com/hugetong/p/12301487.html