Go语法笔记
基本数据类型
- 变量的声明:常量(const) 变量(var) 类型(type)
- 类型转换:需要显式的强制类型转换(不同于 C,表现为强类型语言)
1 | var m float64 = float64(i) |
- String:和 C/C++ 不一样,Go 中的字符串是根据长度限定,而非特殊字符 \0
- 自增/自减运算符:++ 和 – 的只能作为语句,而非表达式 (不同与 C!)
1 | //错误示例 |
控制结构
1. if-else
- Go 看起来不使用分号作为语句的结束,但实际上这一过程是由编译器自动完成
2. switch
- switch 从上往下执行 case 语句直到匹配成功
- 多重条件判断使用 switch true{case: … case: …}形式
3. for
- Go 中的循环体只有 for 一种
- for 后直接加上条件判断成为 C 中的 while
1 | for index < 8{ |
- for-range 遍历
1 | for index , value := range slice1{ |
defer
- defer 语句会将函数推迟到外层函数返回之后执行
数据结构
1.数组(Array)
- sort 包:标准库提供了 sort 包来实现常见的搜索和排序操作
如:func Ints(a [ ]int) 、func Strings(a [ ]string) - 想要在数组或切片中搜索一个元素,该数组或切片必须先被排序(因为标准库的搜索算法使用的是二分法)。然后,使用函数 func SearchInts(a [ ]int, n int) int 进行搜索,并返回对应结果的索引值
1 | sort.Ints(arr) |
2. 切片(Slice)
- 切片和数组的区别:
- new ( ) 和 make ( ) 的区别:
3. 图(Map)
- 切片和图都是引用类型:内存都可以用 make 方法来分配
不要使用 new,永远用 make 来构造 map
- delete( )函数用于删除 map 中的元素
包(Package)
- 包和库函数:包更倾向于提供一种组织和管理代码的机制(?),而库函数更专注于提供特定功能的可重用代码。(GPT)
- container 包:heap、list、ring
- sort 包:排序
- sync 包
结构
- 结构体定义:
1 | type identifier struct { |
- 使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针
var m *T = new(T)
- 声明
var m T
也会给m
分配内存,并零值化内存,但是这个时候m
是类型 T - 内嵌结构体实现“继承”机制: Go 入门指南 10.5.2
函数(Function)
- 函数也是一种类型,可以赋值给变量
1 | thread := function |
- 函数可以作为参数传递给函数
- 函数可以作为函数的返回值
- 匿名函数
- 立即执行函数:创建一个独立的作用域,避免变量污染或者命名冲突
1 | func main() { |
- 闭包(Closure)
性质: 1. 函数嵌套函数 2. 函数内部可以引用外部的参数和变量(capture 捕获) 3. 参数和变量不会被 F 垃圾回收机制回收
示例:Go by Example: Closures)This function value captures its own
i
value
方法(Method)
- 方法是一种特殊类型的函数
- 类型+方法=面向对象中的类
- 方法定义:
- 类型和作用在它上面定义的方法必须在同一个包里定义
1 | func (recv receiver_type) methodName(parameter_list)(return_value_list{ ... } |
- 方法调用:
object.name
(object 为实例,name 为方法) - 函数和方法的区别:
- 函数将变量作为参数:
Function1(recv)
- 方法在变量上被调用:
recv.Method1()
- 函数将变量作为参数: