From 6d395f09ab70a4b7f8ba2d942a545f3f1676eb22 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Thu, 24 Sep 2020 21:55:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0erlang=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../centosGcc升级.md | 0 golang/go101/go函数相关.md | 11 + golang/go101/go包管理.md | 24 +++ .../go101/go协程延迟函数恐慌恢复.md | 21 ++ golang/go101/go常量和变量.md | 60 ++++++ golang/go101/go操作运算符的优先级.md | 5 + golang/go101/go注意事项.md | 3 + golang/go101/go程序源码基本元素.md | 192 ++++++++++++++++++ golang/go101/go语言特性.md | 21 ++ 9 files changed, 337 insertions(+) rename erlang/centos7Gcc升级.md => centos/centosGcc升级.md (100%) create mode 100644 golang/go101/go函数相关.md create mode 100644 golang/go101/go包管理.md create mode 100644 golang/go101/go协程延迟函数恐慌恢复.md create mode 100644 golang/go101/go常量和变量.md create mode 100644 golang/go101/go操作运算符的优先级.md create mode 100644 golang/go101/go注意事项.md create mode 100644 golang/go101/go程序源码基本元素.md create mode 100644 golang/go101/go语言特性.md diff --git a/erlang/centos7Gcc升级.md b/centos/centosGcc升级.md similarity index 100% rename from erlang/centos7Gcc升级.md rename to centos/centosGcc升级.md diff --git a/golang/go101/go函数相关.md b/golang/go101/go函数相关.md new file mode 100644 index 0000000..78497c6 --- /dev/null +++ b/golang/go101/go函数相关.md @@ -0,0 +1,11 @@ + + # 函数声明 + 在go中所有函数都必须声明在包级别代码块中,或者说任何一个函数都不能声明在另一个函数体内 + 虽然匿名函数可以定义在函数体内,但是匿名函数定义不属于函数声明 + + # 函数的退出阶段 + 一个函数从返回开始到最终退出的阶段称为此函数的退出阶段 exiting phase + 函数退出阶段的意义??? + + # 匿名函数 + 注意匿名函数定义不是一个函数声明 \ No newline at end of file diff --git a/golang/go101/go包管理.md b/golang/go101/go包管理.md new file mode 100644 index 0000000..5976592 --- /dev/null +++ b/golang/go101/go包管理.md @@ -0,0 +1,24 @@ +# 代码包和包引入 + go使用代码包 package 来组织管理代码 + +# 代码包目录 代码包引入路径和代码包依赖关系 + + +# init函数 + 在一个代码包中 甚至一个源文件中可以声明若干名为init + 的函数,这些init函数必须不带任何输入参数和返回结果 + + 注意: 我们不能数据声明为init的包级变量 常量或者类型 + + 在程序运行时刻, 在进入main入口函数之前,每个init函数(可以在一个包中声明多个)在此包加载的时候被串行执行并且只执行一次 + +# 程序资源初始化顺序 + 一个程序中所涉及到的所有的在运行时刻要用到的代码包的加载是串行执行的。 在一个程序启动时, 每个包中总是在它所有依赖的包都加载完成之后才开始加载。 程序代码包总是最后一个被加载的代码 包。每个被用到的包会被而且仅会被加载一次。 + 在同一个源文件中声明的init函数将按从上到下的顺序被调用执行。 对于声明在同一个包中的两个不 同源文件中的两个init函数,Go语言白皮书推荐(但不强求)按照它们所处于的源文件的名称的词典 序列(对英文来说,即字母顺序)来调用。 所以最好不要让声明在同一个包中的两个不同源文件中的 两个init函数存在依赖关系。 在加载一个代码包的时候,此代码包中声明的所有包级变量都将在此包中的任何一个init函数执行之 前初始化完毕。 在同一个包内,包级变量将尽量按照它们在代码中的出现顺序被初始化,但是一个包级变量的初始化肯 定晚于它所依赖的其它包级变量。 比如,在下面的代码片段中,四个包级变量的初始化顺序依次 为y、z、x、w。 + +# 完整的引入声明语句的形式 + import importname "path/to/package" + importname是可选的 它的默认值为被引入的包的包名 + + + diff --git a/golang/go101/go协程延迟函数恐慌恢复.md b/golang/go101/go协程延迟函数恐慌恢复.md new file mode 100644 index 0000000..1882d87 --- /dev/null +++ b/golang/go101/go协程延迟函数恐慌恢复.md @@ -0,0 +1,21 @@ +# 主协程 🐖 🐑 🐩 🐈 + 每个Go程序启动的时候只有一个对用户可见的协程,称为主协程 + 当一个主协程退出后, 此程序也就退出了,即使还要一些其他协程在运行 + +# 协程返回值 + 一个协程调用的所有返回值(如果存在) 必须被全部舍弃 + +# waitGroup类型有三个方法 + Add(用来注册新的需要完成的任务数), Done(用来通知某个任务完成了), Wait(此方法用来阻塞等待)到所有任务都已经完成后继续执行其后的语句 + +# defer延迟处理函数 + 和协程调用类似, 被延迟函数调用的所有返回值都必须全部舍弃 + + 当一个函数调用被延迟后, 它不会立即被执行, 它将被推入由当前协程维护的一个延迟调用堆栈。 + 但一个函数调用返回并进入他的退出阶段,所有在此函数中已经被推入的延迟调用将按照它们被推入堆栈的逆顺序执行, + 当所有的延迟调用函数执行完毕之后,此函数调用也就真正的退出了 + + + + + diff --git a/golang/go101/go常量和变量.md b/golang/go101/go常量和变量.md new file mode 100644 index 0000000..67916e6 --- /dev/null +++ b/golang/go101/go常量和变量.md @@ -0,0 +1,60 @@ +# 常量 + 基本类型的字面量表示(除了false和true 他们是预声明的有名常量) 都属于无名常量或者叫字面常量 + 在Go中有些值的类型是不确定的, 这些值称为不确定值,对于大多数不确定值来说, 他们各自有一个默认类型, 除了声明的nil, nil是没有默认的类型的 + 与不确定类型相对应的就是类型确定值 + + 一个字面(常)量的默认类型取决于它的它为何种字面量形式: + 一个字符串字面量的默认类型是预声明的 string 类型。 + 一个布尔字面量的默认类型是预声明的 bool 类型。 + 一个整数型字面量的默认类型是预声明的 int 类型。 + 一个rune字面量的默认类型是预声明的 rune (亦即 int32 )类型。 + 一个浮点数字面量的默认类型是预声明的 float64 类型。 + 如果一个字面量含有虚部字面量,则此字面量的默认类型是预声明的 complex128 类型。 + +## 类型转换 + 对于一个类型不确定常量值 v ,有两种情形显式转换 T(v) 是合法的: + 1.v 可以表示为(第6章) T 类型的一个值。 转换结果为一个类型为 T 的类型确定常量值。 + 2.v 的默认类型是一个整数类型( int 或者 rune ) 并且 T 是一个字符串类型。 转换 T(v) 将 v 看作 + 是一个Unicode码点。 转换结果为一个类型为 T 的字符串常量。 此字符串常量只包含一个Unicode + 码点,并且可以看作是此Unicode码点的UTF-8表示形式。 对于不在合法的Unicode码点取值范围 + 内的整数 v , 转换结果等同于字符串字面量 "\uFFFD" (亦即 "\xef\xbf\xbd" )。 0xFFFD 是 + Unicode标准中的(非法码点的)替换字符值。 (但是请注意,今后的Go版本可能只允许rune或 + 者byte整数被转换为字符串 ? 。 从Go官方工具链1.15版本开始, go vet 命令会对从非rune和非 + byte整数到字符串的转换做出警告。) + +# 变量 + 包级别的变量在声明的时候依赖关系将影响他们的初始化顺序 + +# 常量表达式 + 当一个运算表达式所涉及的是所有操作都是常量的时候,此表达式称为一个常量表达式 + 一个常量表达式的估值是在编译阶段进行的。一个常量表达式的估值依然是一个常量。 + 如果一个表达式中涉及到的操作数中至少有一个不为常量,则此表达式称为非常量表达式 + + 类型确定的有名常量 + const x float32 = 3.14 + + 常量声明中的自动补全 + const ( + X float32 = 3.14 + Y // 这里必须只有一个标识符 + Z // 这里必须只有一个标识符 + + A, B = "Go", "language" + C, _ + // 上一行中的空标识符是必需的(如果 + // 上一行是一个不完整的常量描述)。 + ) + 自定补全为 + const ( + X float32 = 3.14 + Y float32 = 3.14 + Z float32 = 3.14 + + A, B = "Go", "language" + C, _ = "Go", "language" + ) +# 在常量声明中使用iota + iota是Go中预声明的一个特殊的有名常量 iota被预声明为0, 但是在编译阶段并非恒定 + + + diff --git a/golang/go101/go操作运算符的优先级.md b/golang/go101/go操作运算符的优先级.md new file mode 100644 index 0000000..29c9d3f --- /dev/null +++ b/golang/go101/go操作运算符的优先级.md @@ -0,0 +1,5 @@ +1| * / % << >> & &^ +2| + - | ^ +3| == != < <= > >= +4| && +5| || \ No newline at end of file diff --git a/golang/go101/go注意事项.md b/golang/go101/go注意事项.md new file mode 100644 index 0000000..c900932 --- /dev/null +++ b/golang/go101/go注意事项.md @@ -0,0 +1,3 @@ +1. 一般 print和println这两个内置函数并不推荐使用, 在正式的项目中,我们应该尽量使用fmt标准库包声明的相应函数 +2. Go大括号 {} 来显示一个代码块 但是在Go中 { 不能放到下一行 这限制的好处(加快编译速度, 统一编程风格) +3. log标准库中的打印函数是经过了同步处理的, 而fmt标准库中的打印函数却没有被同步, 如果多协程中使用fmt打印则可能会交织在一起(概率性很低) diff --git a/golang/go101/go程序源码基本元素.md b/golang/go101/go程序源码基本元素.md new file mode 100644 index 0000000..7cdb10c --- /dev/null +++ b/golang/go101/go程序源码基本元素.md @@ -0,0 +1,192 @@ +# 代码元素 + 关键字 + 标识符 + 基本类型 和 它们的字面量 + 常量 变量 + 操作符 + 函数声明与函数调用 + 代码包和包引入 + 表达式,语句和简单语句 + 基本流程控制语法 + +# 关键字 共25个分四组 + 用来声明各种代码元素 + const func import package type var + 用于组合类型的字面表示 + chan interface map struct + 基本流程控制 + break case continue default else fallthrough for goto if range switch return select + 特殊流程关键字 + defer go + + +# 标识符 + 一个标识符是以unioncode字母或者 _ 开头并且完全由unioncode字母和uninocode数字组成的单词 + Unicode字母是定义在Unicode标准8.0 ? 中的Lu、Ll、Lt、Lm和Lo分类中的字符。 + Unicode数字是定义在Unicode标准8.0中的Nd数字字符分类中的字符。 + 所有的类型名, 变量名 常量名 跳转标签 包名 和包的引入名 都必须是标识符 + 由UnionCode大写字母开头的标识符成为导出标识符 + +# 基本类型和它们的字面量表示 +## 基本的内置类型(go支持下列基本类型) 也称为 预声明类型 + 1种布尔类型 bool + 11种中内置整数类型 + int8 uint8 int16 uint16 int32 uint32 int64 uint64 int uint uintptr + 2种浮点数类型 + float32 float64 + 2种内置的复数类型 + complex64 complex128 + 1种字符串 + string + + 除了bool和string类型 其他15中内置基本类型都称为数值类型 + + Go中有两种内置类型别名(type alias) + byte是uint8的内置别名 我们可以将byte 和 uint8 看作同一个类型 + rune是uint32内置别名 我们可以将rune 和 uint32 看作容一个类型 + + 其中 uintptr int uint 类型的值的尺寸都依赖于具体的编译器实现 通常在64位架构上 int,uint类型的 + 值是64位,在32位是则是32位 + 编译器必输保证uintptr类型的值的尺寸能够存下任意一个内存地址 + + complex64复数值的实部和虚部都是float32 + complex128复数值的实部和虚部都是float64 + 在内存中 浮点数都是用IEEE-754格式存储 + + 尽管布尔和字符串类型分类各自只有一种类型,我们可以声明更多的自定义布尔和字符串类型 + + 1| // 一些类型定义声明 + 2| type status bool // status和bool是两个不同的类型 + 3| type MyString string // MyString和string是两个不同的类型 + 4| type Id uint64 // Id和uint64是两个不同的类型 + 5| type real float32 // real和float32是两个不同的类型 + 6| + 7| // 一些类型别名声明 + 8| type boolean = bool // boolean和bool表示同一个类型 + 9| type Text = string // Text和string表示同一个类型 + 10| type U8 = uint8 // U8、uint8和 byte表示同一个类型 + 11| type char = rune // char、rune和int32表示同一个类型 + +# 零值 + 每种类型都有一个零值, 零值都可以看做此类型的默认值, 相应类型的零值如下 + bool: false + 数值类型: 0 (虽然都是零 但是内存占用不同) + 字符串: "" + +# 基本类型的字面量表示形式 + 一个值的字面形式称为一个字面量,它表示此值在代码中的字体体现形式(和内存中的表现形式相对应) + 一个值可能有很多种字面量形式 +## 布尔值的字面量形式 + true false +## 整数类型值的字面量形式 + 整数类型值有四种字面量形式: + 十进制形式(decimal) 不能以 0 开头 + 八进制形式(octal) )0o 0O 0 开头 + 十六进制形式(hex) 0x 0X 开头 + 二进制形式(binary) 0b 0B 开头 +## 浮点数类型值的字面量形式 + 一个浮点数的完整字面量形式包含一个十进制整数部分, 一个小数点 一个十进制小数部分和一个整数指数部分,部分可以省略 + xEn 表示x乘以10的n次方 xE-n 表示x除以10的n次方 + go也支持另外啊一种浮点数字面量形式 称为 十六进制浮点数文字表示 在一个十六进制浮点数文字表示中 + 1.和整数的十六进制文字表示一样,浮点数的十六进制文字表示也必须使用0x或0X开头 + 2.和整数的十六进制表示不同的是,字母p或者P必须出现在浮点数的十六进制表示中,其后跟随一个幂指数(底数为2) + + 浮点类型的零值标准字面量形式为0.0 当然其他的形式表示也是合法的 比如 0. .0 0e0 和 0x0p0 + +## 虚部字面形式 + 一个虚部值的字面量形式由一个浮点数字面量或者一个整数字面量和其后跟随一个小写的字母i组成 + 复数零值的标准字面表示为 0.0+0.0i 。 当然 0i 、 .0i 、 0+0i 等表示也是合法的。 + + 数值字面表示中使用下划线分段来增强可读性 + 下划线 _ 可以出现在整数、浮点数和虚部数字面量中,以用做分段符以增强可读性。 + 但是要注意,在一个数值字面表示中,一个下划线 _ 不能出现在此字面表示的首尾,并且其两侧的字符 + 必须为(相应进制的)数字字符或者进制表示头。 + +## rune值的字面量形式 + 上面已经提到, rune 类型是 int32 类型的别名。 因此,rune类型(泛指)是特殊的整数类型。 一个 + rune值可以用上面已经介绍的整数类型的字面量形式表示。 另一方面,很多各种整数类型的值也可以 + 用本小节介绍的rune字面量形式来表示。 + 在Go中,一个rune值表示一个Unicode码点。 一般说来,我们可以将一个Unicode码点看作是一个 + Unicode字符。 但是,我们也应该知道,有些Unicode字符由多个Unicode码点组成。 每个英文或中文 + Unicode字符值含有一个Unicode码点。 + 一个rune字面量由若干包在一对单引号中的字符组成。 包在单引号中的字符序列表示一个Unicode码点 + 值。 rune字面量形式有几个变种,其中最常用的一种变种是将一个rune值对应的Unicode字符直接包在 + 一对单引号中。比如: + 'a' // 一个英文字符 + 'π' + '众' // 一个中文字符 + 下面这些rune字面量形式的变种和 'a' 是等价的 (字符 a 的Unicode值是97)。 + '\141' // 141是97的八进制表示 + '\x61' // 61是97的十六进制表示 + '\u0061' + '\U00000061' + + 注意: \ 之后必须跟随三个八进制数字字符(0-7)表示一个byte值, \x 之后必须跟随两个十六进制数 + 字字符(0-9,a-f和A-F)表示一个byte值, \u 之后必须跟随四个十六进制数字字符表示一个rune值 + (此rune值的高四位都为0), \U 之后必须跟随八个十六进制数字字符表示一个rune值。 这些八进制 + 和十六进制的数字字符序列表示的整数必须是一个合法的Unicode码点值,否则编译将失败。 + + 事实上,在日常编程中,这四种rune字面量形式的变种很少用来表示rune值。 它们多用做字符串的双 + 引号字面量形式中的转义字符 + + 如果一个rune字面量中被单引号包起来的部分含有两个字符, 并且第一个字符是 \ ,第二个字符不 + 是 x 、 u 和 U ,那么这两个字符将被转义为一个特殊字符。 目前支持的转义组合为: + \a (rune值:0x07) 铃声字符 + \b (rune值:0x08) 退格字符(backspace) + \f (rune值:0x0C) 换页符(form feed) + \n (rune值:0x0A) 换行符(line feed or newline) + \r (rune值:0x0D) 回车符(carriage return) + \t (rune值:0x09) 水平制表符(horizontal tab) + \v (rune值:0x0b) 竖直制表符(vertical tab) + \\ (rune值:0x5c) 一个反斜杠(backslash) + \' (rune值:0x27) 一个单引号(single quote) + + rune类型的零值常用 '\000' 、 '\x00' 或 '\u0000' 等来表示。 + +## 字符串的字面量形式 + 在Go中,字符串值是UTF-8编码,甚至所有的Go源码都必须是UTF-8编码 + Go字符串字面量形式有两种, 一种是解释型字面表示 双引号格式 另外一种是直白字面表示 反引号格式 + + 在上面的解释形式(双引号风格)的字符串字面量中,每个 \n 将被转义为一个换行符,每个 \" 将被转 + 义为一个双引号字符。 双引号风格的字符串字面量中支持的转义字符和rune字面量基本一致,除了一 + 个例外:双引号风格的字符串字面量中支持 \" 转义,但不支持 \' 转义;而rune字面量则刚好相反。 + 以 \ 、 \x 、 \u 和 \U 开头的rune字面量(不包括两个单引号)也可以出现在双引号风格的字符串字面量 + 中 + + 直白反引号风格的字面表示中是不支持转义字符的。 除了首尾两个反引号,直白反引号风格的字面表 + 示中不能包含反引号。 为了跨平台兼容性,直白反引号风格的字面表示中的回车符(Unicode码点 + 为 0x0D ) 将被忽略掉。 + 字符串类型的零值在代码里用 "" 或 `` 表示。 + +# 基本数值类型字面量的使用范围 + 当一个数值型的字面量用来表示一个整数基本类型的时候,舍入是不允许的 比如1.0可以表示任何基本整数类型的值 + 但是1.01 却不可以 当一个数值型的字面量用来表示一个非整数的基本类型的值时,舍入是允许的 + + 注意几个溢出的例子: + 字面量 0x10000000000000000 需要65个比特才能表示, 所以在运行时刻,任何基本整数类型都 + 不能精确表示此字面量。 + 在IEEE-754标准中,最大的可以精确表示的float32类型数值 + 为 3.40282346638528859811704183484516925440e+38 ,所以 3.5e38 不能表示任何float32 + 和complex64类型的值。 + 在IEEE-754标准中,最大的可以精确表示的float64类型数值 + 为 1.797693134862315708145274237317043567981e+308 ,因此 2e+308 不能表示任何基本数 + 值类型的值。 + 尽管 0x10000000000000000 可以用来表示float32类型的值,但是它不能被任何float32类型的值 + 所精确表示。上面已经提到了,当使用字面量来表示非整数基本数值类型的时候,精度丢失是允 + 许的(但溢出是不允许的)。 + + + + + + + + + + + + + + + + diff --git a/golang/go101/go语言特性.md b/golang/go101/go语言特性.md new file mode 100644 index 0000000..e78c725 --- /dev/null +++ b/golang/go101/go语言特性.md @@ -0,0 +1,21 @@ +# go语言特性 + 内置并发编程支持 + 使用携程 goroutine 作为基本计算单元 + 使用通道 channel 作为通信和同步 + 内置了map slice 类型 + 支持多态 + 使用接口 interface 来实现value boxing 和 反射 reflection + 支持指针 + 支持函数闭包 closure + 支持方法 + 支持延迟函数调用 defer + 支持类型内嵌 type embedding + 支持类型推断 type deduction or type inference + 内存安全 + 自动垃圾回收 + 良好的代码跨平台性 + + + + + \ No newline at end of file