我有关编程语言的一点理解
副标题:[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://blog.golang.org/why-generics
-------- comment @ 20200222 -------
这个继承的例子写的挺好的。
https://www.jianshu.com/p/150523db21a9