|
@@ -0,0 +1,244 @@
|
|
|
+# Go语言简介
|
|
|
+
|
|
|
+Go是一门编译型的和静态的编译语言。
|
|
|
+
|
|
|
+- 内置并发编程支持:
|
|
|
+ a. 使用协程(goroutine)作为基本的计算单位。轻松地创建协程
|
|
|
+ b. 使用通道(channel)来实现协程间的同步和通信
|
|
|
+- 内置映射(map)和切片(slice)类型
|
|
|
+- 支持多态---?
|
|
|
+- 使用接口(interface)来实现装盒(value boxing)和反射(reflection)
|
|
|
+- 支持指针
|
|
|
+- 支持函数闭包------?
|
|
|
+- 支持方法
|
|
|
+- 支持延迟函数调用
|
|
|
+- 支持类型内嵌------指方法的定义?
|
|
|
+- 支持类型推断-----?
|
|
|
+- 内存安全----?
|
|
|
+- 自动垃圾回收-----?
|
|
|
+- 良好的代码跨平台性----二进制文件?
|
|
|
+- 自定义泛型-----(指自定义库?)
|
|
|
+
|
|
|
+## 最简单的Go程序
|
|
|
+
|
|
|
+```go
|
|
|
+package main
|
|
|
+
|
|
|
+func main() {
|
|
|
+
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+`package` 和 `func` 是两个关键字。两个 `main` 是两个标识符。
|
|
|
+
|
|
|
+此程序第一行指定了当前源代码文件所处的包的包名(此处为main)。
|
|
|
+第三行和第四行声明了一个名为 `main` 的函数。此函数为程序的入口函数。
|
|
|
+
|
|
|
+## 运行一个Go程序
|
|
|
+
|
|
|
+Go官方工具链工具要求所有的Go源码文件以.go后缀结尾
|
|
|
+
|
|
|
+运行单个go源码文件
|
|
|
+`go run test.go`
|
|
|
+
|
|
|
+如果一个程序的main包中有若干Go源代码文件,在相应目录下可以用下面的命令运行此程序。
|
|
|
+`go run .`
|
|
|
+
|
|
|
+## Go 子命令
|
|
|
+
|
|
|
+- go run 不推荐在正式的大型目中使用。对于正式的项目,最好用go build 或者go install 构建可执行文件来运行Go程序
|
|
|
+- go mod init -------------?
|
|
|
+ go mod tidy 扫描项目,添加依赖至 go.mod 或者从中删除不再被使用的依赖
|
|
|
+ go get 添加、升级、降级或者删除单个依赖。
|
|
|
+- 以 _ 和 . 开头的源代码文件会被Go官方工具链工具忽略掉
|
|
|
+- go run 、 go build 和 go install 只会输出代码语法错误
|
|
|
+ go vet 可以输出警告
|
|
|
+- go fmt 格式化代码
|
|
|
+- go test 运行单元和基准测试用例
|
|
|
+- go doc 在终端中查看Go代码库包的文档
|
|
|
+
|
|
|
+# 程序源码基本元素介绍
|
|
|
+
|
|
|
+在大多数高级编程语言中,数据通常被抽象为各种类型(type)和值(value)。 一个类型可以看作是值的模板。一个值可以看作是某个类型的实例。 大多数编程语 言支持自定义类型和若干预声明类型(即内置类型)。
|
|
|
+
|
|
|
+### 函数说明
|
|
|
+
|
|
|
+- 入参是int
|
|
|
+- 返回结果也是int,两个
|
|
|
+
|
|
|
+```go
|
|
|
+func StatRandomNumbers(numRands int) (int, int) {
|
|
|
+ // 声明了两个变量(类型都为int,初始值都为0)
|
|
|
+ var a, b int
|
|
|
+ // 一个for循环代码块
|
|
|
+ for i := 0; i < numRands; i++ {
|
|
|
+ // 一个if-else条件控制代码块
|
|
|
+ if rand.Intn(MaxRand) < MaxRand/2 {
|
|
|
+ a = a + 1
|
|
|
+ } else {
|
|
|
+ b++ // 等价于:b = b + 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return a, b // 此函数返回两个结果
|
|
|
+}
|
|
|
+
|
|
|
+x, y := StatRandomNumbers(num)
|
|
|
+```
|
|
|
+
|
|
|
+函数左括号不能位于行首(单独换行)
|
|
|
+
|
|
|
+# 关键字和标识符
|
|
|
+
|
|
|
+## 关键字
|
|
|
+
|
|
|
+- const、func、import、package、type和var用来声明各种代码元素。
|
|
|
+- chan、interface、map和struct用做 一些组合类型的字面表示中。
|
|
|
+- break、case、continue、default、 else、fallthrough、for、 goto、if、range、 return、select和switch用在流程控制语句中。 详见基本流程控制语法(第12章)。
|
|
|
+- defer和go也可以看作是流程控制关键字, 但它们有一些特殊的作用。详见 协程和延迟函数调用(第13章)。
|
|
|
+
|
|
|
+## 标识符
|
|
|
+
|
|
|
+一个标识符是一个以Unicode字母或者_开头并且完全由Unicode字母和Unicode数字 组成的单词。
|
|
|
+
|
|
|
+- 导出标识符,需要首字母大写,不能以 _ 开头
|
|
|
+- 东方字符都被视为非导出字符
|
|
|
+
|
|
|
+# 基本类型及其字面量表示
|
|
|
+
|
|
|
+这边有问题的话,具体还是看书吧,不好说
|
|
|
+
|
|
|
+## 基本内置类型
|
|
|
+
|
|
|
+内置类型也称为预声明类型
|
|
|
+
|
|
|
+Go支持如下内置基本类型:
|
|
|
+
|
|
|
+- 一种内置布尔类型:bool。
|
|
|
+- 11种内置整数类型:int8、uint8、int16、uint16、int32、uint32、 int64、uint64、int、uint和uintptr。
|
|
|
+- 两种内置浮点数类型:float32和float64。
|
|
|
+- 两种内置复数类型:complex64和complex128。
|
|
|
+- 一种内置字符串类型:string。
|
|
|
+
|
|
|
+除了bool和string类型,其它的15种内置基本类型都称为数值类型(整型、浮点 数型和复数型)。
|
|
|
+
|
|
|
+Go中有两种内置类型别名(type alias):
|
|
|
+
|
|
|
+- byte是uint8的内置别名。 我们可以将byte和uint8看作是同一个类型。
|
|
|
+- rune是int32的内置别名。 我们可以将rune和int32看作是同一个类型。
|
|
|
+
|
|
|
+**自定义类型**
|
|
|
+
|
|
|
+```go
|
|
|
+type status bool // status和bool是两个不同的类型
|
|
|
+type boolean = bool // boolean和bool表示同一个类型
|
|
|
+```
|
|
|
+
|
|
|
+## 零值
|
|
|
+
|
|
|
+每种类型都有一个零值。一个类型的零值可以看作是此类型的默认值。
|
|
|
+
|
|
|
+- bool 的零值是 false
|
|
|
+- 数组类型的零值都是 0 (不同类型的 0 在内存中占用空间可能不同)。
|
|
|
+- 字符串类型的零值是一个空字符串
|
|
|
+
|
|
|
+## 基本类型的字面量表示形式
|
|
|
+
|
|
|
+### 布尔值的字面量形式
|
|
|
+
|
|
|
+我们可以将false和true这两个预声 明的具名常量当作布尔类型的字面量形式。 但是,我们应该知道,从严格意义上 说,它们不属于字面量。
|
|
|
+
|
|
|
+### 整数类型值的字面量形式
|
|
|
+
|
|
|
+整数类型值有四种字面量形式:十进制形式(decimal)、八进制形式(octal)、 十六进制形式(hex)和二进制形式(binary)。
|
|
|
+
|
|
|
+```go
|
|
|
+package main
|
|
|
+
|
|
|
+func main(){
|
|
|
+ println(15 == 017) //true
|
|
|
+ println(15 == 0xF) //true
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 浮点数类型值的字面量形式
|
|
|
+
|
|
|
+```go
|
|
|
+1.23
|
|
|
+01.23 // == 1.23
|
|
|
+.23
|
|
|
+1.
|
|
|
+// 一个e或者E随后的数值是指数值(底数为10)。
|
|
|
+// 指数值必须为一个可以带符号的十进制整数字面量。
|
|
|
+1.23e2 // == 123.0
|
|
|
+123E2 // == 12300.0
|
|
|
+123.E+2 // == 12300.0
|
|
|
+1e-1 // == 0.1
|
|
|
+.1e0 // == 0.1
|
|
|
+0010e-2 // == 0.1
|
|
|
+0e+5 // == 0.0
|
|
|
+```
|
|
|
+
|
|
|
+### 虚部字面量形式
|
|
|
+
|
|
|
+过
|
|
|
+
|
|
|
+数值字面表示中使用下划线分段来增加可读性
|
|
|
+
|
|
|
+```go
|
|
|
+// 合法的使用下划线的例子
|
|
|
+6_9 // == 69
|
|
|
+0_33_77_22 // == 0337722
|
|
|
+0x_Bad_Face // == 0xBadFace
|
|
|
+0X_1F_FFP-16 // == 0X1FFFP-16
|
|
|
+0b1011_0111 + 0xA_B.Fp2i
|
|
|
+// 非法的使用下划线的例子
|
|
|
+_69 // 下划线不能出现在首尾
|
|
|
+69_ // 下划线不能出现在首尾
|
|
|
+6__9 // 下划线不能相连
|
|
|
+0_xBadFace // x不是一个合法的八进制数字
|
|
|
+1_.5 // .不是一个合法的十进制数字
|
|
|
+1._5 // .不是一个合法的十进制数字
|
|
|
+```
|
|
|
+
|
|
|
+### rune值的字面量形式
|
|
|
+
|
|
|
+```go
|
|
|
+1| package main
|
|
|
+2|
|
|
|
+3| func main() {
|
|
|
+4| println('a' == 97)
|
|
|
+5| println('a' == '\141')
|
|
|
+6| println('a' == '\x61')
|
|
|
+7| println('a' == '\u0061')
|
|
|
+8| println('a' == '\U00000061')
|
|
|
+9| println(0x61 == '\x61')
|
|
|
+10| println('\u4f17' == '众')
|
|
|
+11| }
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 字符串的字面量形式
|
|
|
+
|
|
|
+略
|
|
|
+
|
|
|
+# 常量和变量
|
|
|
+
|
|
|
+## 类型不确定值和类型确定值
|
|
|
+
|
|
|
+在Go中,有些值的类型是不确定的。换句话说,有些值的类型有很多可能性。 这些 值称为类型不确定值。对于大多数类型不确定值来说,它们各自都有一个默认类 型, 除了预声明的nil。nil是没有默认类型的。
|
|
|
+
|
|
|
+默认类型,就是你声明一个变量,不说明它的类型,就被当成默认类型
|
|
|
+
|
|
|
+- 字符串字面量的默认类型是预声明的string类型
|
|
|
+- 一个布尔字面量的默认类型是预声明的bool类型。
|
|
|
+- 一个整数型字面量的默认类型是预声明的int类型。
|
|
|
+- 一个rune字面量的默认类型是预声明的rune(亦即int32)类型。
|
|
|
+- 一个浮点数字面量的默认类型是预声明的float64类型。
|
|
|
+- 如果一个字面量含有虚部字面量,则此字面量的默认类型是预声明的 complex128类型。
|
|
|
+
|
|
|
+## 类型不确定厂里的显示类型转换
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|