Go Programming Language
2021-08-11 22:44:43 0 举报
学习笔记
作者其他创作
大纲/内容
项目实战
补充资料
背景
设计目标
设计网络和多核时代的C语言
基因图谱
基因图谱介绍
左侧图谱:Go 语言的并发特性是由贝尔实验室的 Hoare 于1978年发布的 CSP 理论演化而来。其后,CSP 并发模型在 Squeak/NewSqueak 和 Alef 等编程语言中逐步完善并走向实际应用,最终这些设计经验被消化并吸收到了 Go 语言中。业界比较熟悉的 Erlang 编程语言的并发编程模型也是 CSP 理论的另一种实现
中间图谱:包含了Go语言中面向对象和包特性的演化历程。Go语言中包和接口以及面向对象等特性则继承自Niklaus Wirth所设计的Pascal语言以及其后所衍生的相关编程语言。其中包的概念、包的导入和声明等语法主要来自于Modula-2编程语言,面向对象特性所提供的方法的声明语法等则来自于Oberon编程语言。最终Go语言演化出了自己特有的支持鸭子面向对象模型的隐式接口等诸多特性。
右侧图谱:是对C语言的致敬。Go语言是对C语言最彻底的一次扬弃,不仅仅是语法和C语言有着很多差异,最重要的是舍弃了C语言中灵活但是危险的指针运算。而且,Go语言还重新设计了C语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。当然,C语言中少即是多、简单直接的暴力编程哲学则被Go语言更彻底地发扬光大了(Go语言居然只有25个关键字,sepc语言规范还不到50页))。
Go的语言发展史
你好,世界!
所有的Go程序,都是由最基本的函数和变量构成,函数和变量被组织到一个个单独的Go源文件中,这些源文件再按照作者的意图组织成合适的package,最终这些package再有机地组成一个完整的Go语言程序
历史概览
B 语言时代 - 1972
C语言时代 - 1974~1989
丰富了类型系统,ANSI C89 使用最为广泛
Newsqueak - 1989
并发和管道
Alef - 1993
Alef 存在良好的并发特性,但是由于内存回收管理机制缺失,导致并发体的内存资源管理异常复杂
Limbo - 1995
支持模块化编程
支持编译时和运行时强类型检查
进程内基于具有类型的通信管道
原子性垃圾收集
简单的抽象数据类型
Go语言 - 2007~2009
在2007年底,Go语言三个最初的作者因为偶然的因素聚集到一起批斗C++(传说是C++语言的布道师在Google公司到处鼓吹的C++11各种牛逼特性彻底惹恼了他们),他们终于抽出了20%的自由时间创造了Go语言
2008年3月,语言规范开始编写
2008年5月,得到领导支持,开始全日制进行开发
你好,世界! V2.0
基于网络服务提供打印Hello,World的功能
Golang的设计哲学
简洁编程哲学
简洁的设计需要在工作开始的时候舍弃不必要的想法,并且在软件的生命周期内严格区别好的改变和坏的改变。通过足够的努力,一个好的改变可以在不破坏原有完整概念的前提下保持自适应,正如Fred Brooks所说的“概念完整性”;而一个坏的改变则不能达到这个效果,它们仅仅是通过肤浅的和简单的妥协来破坏原有设计的一致性。只有通过简洁的设计,才能让一个系统保持稳定、安全和持续的进化。
正如Rob Pike所说,“软件的复杂性是乘法级相关的”,通过增加一个部分的复杂性来修复问题通常将慢慢地增加其他部分的复杂性。通过增加功能、选项和配置是修复问题的最快的途径,但是这很容易让人忘记简洁的内涵,即从长远来看,简洁依然是好软件的关键因素。
简洁的设计需要在工作开始的时候舍弃不必要的想法,并且在软件的生命周期内严格区别好的改变和坏的改变。通过足够的努力,一个好的改变可以在不破坏原有完整概念的前提下保持自适应,正如Fred Brooks所说的“概念完整性”;而一个坏的改变则不能达到这个效果,它们仅仅是通过肤浅的和简单的妥协来破坏原有设计的一致性。只有通过简洁的设计,才能让一个系统保持稳定、安全和持续的进化。
基础知识
基本元素结构
package
如果一个go文件是主执行文件,package 命名为 main
其他情况可以作为模块名
import
必须恰当导入需要的包,缺少了必要的包或者导入了不需要的包,程序都无法编译通过
声明必须跟在文件的package声明之后
一个函数的声明由func关键字、函数名、参数列表、返回值列表以及包含在大括号里的函数体组成
关于分号: Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句
关键字
变量、常量
符号 := 是短变量声明(short variable declaration)的一部分,这是定义一个或多个变量并根据它们的初始值为这些变量赋予适当类型的语句
关于声明变量
s := ""
var s string
var s = ""
var s string = ""
var s string
var s = ""
var s string = ""
第一种形式,是一条短变量声明,最简洁,但只能用在函数内部,而不能用于包变量。
第二种形式依赖于字符串的默认初始化零值机制,被初始化为""。
第三种形式用得很少,除非同时声明多个变量。
第四种形式显式地标明变量的类型,当变量类型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须 。
作用域
表达式
控制流
函数
包、文件
Go语言的代码通过包(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)
main 包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在 main 里的 main 函数 也很特殊,它是整个程序执行时的入口
类型系统
基本类型
数组、字符串、切片、动态链表
错误处理
进阶知识
0 条评论
下一页