### Golang 学习笔记知识点总结 #### 一、Golang 语言特性概览 **Golang**(或称为 **Go**)是一种开源的编程语言,由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计开发。它以其简洁、高效、并发性强等特点而闻名,适合构建大规模网络服务器及数据管道。 ##### 1.1 变量 - **定义与初始化**:Go 是一种静态类型语言,意味着变量类型一旦确定就不能更改。变量可以通过 `var` 关键字声明,并自动初始化为该类型的零值。例如,`var x int` 会自动将 `x` 初始化为整型的零值 `0`。如果提供了初始化值,则可以省略类型声明,编译器会自动推导类型。例如:`var f float32 = 1.6`。 - **简短声明**:在函数体内,可以使用 `:=` 运算符进行简短声明和初始化,如 `x := 123`。需要注意的是,这种方式可能会导致在函数内部无意间修改全局变量的问题,因为编译器默认认为这是一个新的局部变量。 - **批量声明**:可以在同一行声明多个变量,且这些变量可以有不同的类型,例如:`var x, y, z int` 或者 `var (a int; b float32)`。 - **多变量赋值**:Go 支持同时对多个变量进行赋值操作,且这些赋值是同时发生的,例如:`i, data[i] = 2, 100`,先计算右边的表达式,再从左至右赋值。 - **忽略变量**:如果不需要某个变量的值,可以使用 `_` 来表示忽略,例如:`_, err := someFunction()`。 ##### 1.2 常量 - **声明与初始化**:常量同样使用 `const` 关键字定义,并且一旦定义后不能改变其值。例如:`const PI = 3.14159`。 - **类型推导**:如果明确指定了数值,那么编译器会根据数值的类型自动推导出常量的类型。 - **复合常量**:可以一次性定义多个常量,例如:`const (a, b = "hello", 123)`。 ##### 1.3 基本类型 - **整型**:包括 `int`, `int8`, `int16`, `int32`, `int64` 等不同位宽的整型。 - **浮点型**:包括 `float32` 和 `float64`。 - **布尔型**:`bool` 类型,值可以是 `true` 或 `false`。 - **字符型**:`rune` 类型,用于存储单个 Unicode 字符。 - **字符串**:`string` 类型,用于存储文本序列。 - **空接口**:`interface{}` 类型,可以存储任何类型的数据。 ##### 1.4 引用类型 - **数组**:固定长度的元素集合,例如:`var arr [5]int`。 - **切片**:动态大小的数组,例如:`var slice []int`。 - **映射**:键值对集合,例如:`var mapVar map[string]int`。 - **指针**:存储变量地址的数据类型,例如:`var ptr *int`。 - **结构体**:自定义数据类型,由一系列属性组成,例如:`type Person struct { Name string; Age int }`。 ##### 1.5 类型转换 - 在 Go 中,类型转换是显式的,必须通过类型转换操作符来执行。例如,将 `int` 转换为 `float64`,可以使用 `(float64)(intValue)`。 ##### 1.6 字符串 - **字符串字面量**:可以使用双引号 `""` 或反引号 `"""..."""` 来定义字符串。 - **字符串拼接**:使用 `+` 运算符或者 `fmt.Sprintf` 函数来拼接字符串。 - **字符串不可变性**:Go 中的字符串是不可变的,即不能直接修改其内容。 ##### 1.7 指针 - **定义与使用**:指针用于存储变量的地址。定义指针使用星号 `*`,例如:`var ptr *int`。访问指针指向的值使用 `*ptr`。 - **指针运算**:Go 不支持指针算术运算。 ##### 1.8 自定义类型 - **定义自定义类型**:使用 `type` 关键字定义新的类型别名,例如:`type MyInt int`。 - **类型重用**:自定义类型可以基于现有的类型定义,从而继承其属性和方法。 #### 二、表达式与控制流 ##### 2.1 表达式 - **算术表达式**:支持加、减、乘、除、取模等运算。 - **比较表达式**:支持等于 (`==`)、不等于 (`!=`)、小于 (`<`)、大于 (`>`) 等关系运算符。 - **逻辑表达式**:支持逻辑与 (`&&`)、逻辑或 (`||`) 运算符。 ##### 2.2 控制流 - **条件语句**:使用 `if` 语句来执行条件判断。例如:`if x > 0 { fmt.Println("Positive") }`。 - **循环语句**:支持 `for` 循环。例如:`for i := 0; i < 10; i++ { fmt.Println(i) }`。 - **开关语句**:使用 `switch` 语句来执行多分支选择。例如:`switch x { case 1: fmt.Println("One"); break }`。 - **循环控制**:可以使用 `break`、`continue` 和 `goto` 控制循环流程。 #### 三、函数与方法 ##### 3.1 函数定义 - **定义语法**:函数的基本定义格式为 `func functionName(parameters) (returnValues) { ... }`。 - **参数传递**:Go 使用值传递的方式,即函数不会直接修改传入的参数。 ##### 3.2 变参 - **变长参数列表**:可以在函数定义时使用 `...` 来接受任意数量的同类型参数。例如:`func print(args ...string) { for _, arg := range args { fmt.Println(arg) } }`。 ##### 3.3 返回值 - **多返回值**:Go 支持函数返回多个值。例如:`func divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil }`。 ##### 3.4 匿名函数 - **定义**:可以直接在代码中定义并调用匿名函数,例如:`func() { fmt.Println("Hello, anonymous!") }()` ##### 3.5 延迟调用 - **延迟执行**:使用 `defer` 关键字可以指定函数在当前函数退出之前执行。例如:`defer fmt.Println("Goodbye!")`。 ##### 3.6 错误处理 - **错误对象**:通常使用 `error` 接口类型作为函数的返回值之一,来表示错误信息。例如:`func readFile(path string) ([]byte, error) { ... }`。 #### 四、数据结构 ##### 4.1 数组 - **定义与初始化**:使用 `[length]type` 定义数组,例如:`var arr [5]int`。 - **索引访问**:可以通过索引访问数组元素,例如:`arr[0]`。 - **遍历**:可以使用 `for` 循环遍历数组,例如:`for i := range arr { fmt.Println(arr[i]) }`。 ##### 4.2 切片 - **定义与初始化**:使用 `[]type` 定义切片,例如:`var slice []int`。 - **动态调整**:切片支持动态扩展或缩小,例如:`slice = append(slice, 100)`。 - **切片操作**:可以使用 `slice[start:end]` 获取子切片。 ##### 4.3 映射 - **定义与初始化**:使用 `map[keyType]valueType` 定义映射,例如:`var m map[string]int`。 - **添加与访问**:使用 `m[key]` 添加或访问元素,例如:`m["key"] = 123` 或 `value := m["key"]`。 ##### 4.4 结构体 - **定义与初始化**:定义结构体使用 `type` 关键字,例如:`type Person struct { Name string; Age int }`。 - **字段访问**:可以通过 `.` 运算符访问结构体字段,例如:`p.Name`。 #### 五、接口与方法 ##### 5.1 接口定义 - **定义语法**:使用 `type` 关键字定义接口类型,例如:`type Speaker interface { Speak() string }`。 - **实现接口**:类型自动实现接口中的方法,无需显式声明。 ##### 5.2 执行机制 - **接口实现原理**:接口类型实际上包含了一个指向实现该接口的具体类型的指针以及一个方法表,方法表中包含了该类型的所有方法。 - **接口实例化**:可以将实现了特定接口的类型赋值给该接口变量。 ##### 5.3 接口转换 - **类型断言**:使用类型断言来访问接口变量中的具体类型,例如:`if v, ok := obj.(int); ok { fmt.Println(v) }`。 ##### 5.4 表达式 - **类型检查**:使用 `instanceof` 关键字来检查一个变量是否实现了某个接口,例如:`if _, ok := obj.(Speaker); ok { ... }`。 #### 六、并发 ##### 6.1 Goroutine - **定义与启动**:使用 `go` 关键字启动一个新的 Goroutine,例如:`go func() { fmt.Println("Hello from Goroutine!") }()`。 - **生命周期管理**:Goroutine 的生命周期由运行时管理,无需手动销毁。 ##### 6.2 Channel - **定义与使用**:通道用于 Goroutine 之间的通信,例如:`ch := make(chan int)`。 - **发送与接收**:使用 `<-` 运算符发送或接收数据,例如:`ch <- 100` 或 `value := <-ch`。 - **缓冲通道**:可以定义具有缓冲区的通道,例如:`ch := make(chan int, 10)`。 #### 七、包与工具 ##### 7.1 工作空间 - **标准布局**:Go 的工作空间通常遵循特定的目录结构,其中包含 `src`、`pkg` 和 `bin` 目录。 ##### 7.2 源文件 - **文件组织**:每个 Go 文件通常定义一个包,文件名应与包名一致。 ##### 7.3 包结构 - **导入与使用**:使用 `import` 关键字导入其他包,例如:`import "fmt"`。 ##### 7.4 文档 - **生成文档**:Go 提供了 `godoc` 工具来生成和查看文档。 #### 八、进阶主题 ##### 8.1 内存布局 - **堆与栈**:Go 中的内存分为堆内存和栈内存,堆内存用于动态分配的空间,栈内存用于函数调用时局部变量的存储。 ##### 8.2 指针陷阱 - **空指针解引用**:尝试解引用空指针会导致运行时错误。 ##### 8.3 cgo - **Go 与 C 交互**:cgo 是 Go 编译器的一个特性,允许 Go 代码直接调用 C 库。 ### 结论 这篇笔记涵盖了 Go 语言的基础和高级概念,旨在帮助读者快速上手 Go 语言,并理解其核心功能。通过深入学习这些内容,开发者可以更好地利用 Go 构建高性能的应用程序和服务。此外,Go 社区非常活跃,不断推出新特性和优化,因此持续关注 Go 的最新发展也是非常重要的。















- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 煤层厚度在线监测装置.pptx
- 钢筋隐蔽工程检查验收记录.doc
- 崩岸险情的判断和抢护.docx
- 现代城工程监理旁站方案.doc
- Ck、白蚁防治施工工程合同.doc
- 微信公众平台 _小程序 API文档http___wxopen.notedown.cn_.zip
- 2010年公路改造工程施工招标文件.doc
- 网上下载-北京市科技计划项目实施方案.doc
- WxMasonry-微信小程序瀑布流布局模式.zip
- 本科期末考试题.doc
- 注册公用设备工程师模拟题九.doc
- 10.运用QC方法提高石灰土路基压实--九冶建设有限公司石灰路基QC小组.ppt
- 加气混凝土条板墙面抹灰工艺.doc
- 城区污水主干管一期工程招标文件.doc
- 压缩机安装工艺.doc
- 让你的微信小程序支持谷歌统计(Google Analytics).zip


