基础语法
变量定义
1 | 变量需要先声明,再赋值 |
常量定义
1 | // const是用来定义常量的 |
条件语句和循环
if条件语句
1 | if a == 100{ |
switch条件语句
1 | // go中的switch会自动break,除非使用fallthrough |
for循环
1 | // 赋值语句;判断语句;递增语句 |
函数
1 | // 格式 |
指针
1 | // go语言的参数传递是值传递 |
内建容器
数组
定义数组
1 | var arr [3]int // 会初始化为 [0,0,0] |
遍历数组
1 | arr := [3]int{1, 2, 3} |
函数传递(按值传递)
1 | // 注意,[5]int 与 [10]int是不同类型的 |
切片
概念
1 | // 顾首不顾尾 |
视图
1 | // 切片是数组的 "视图" , 即引用 |
切片的扩展(cap)
1 | // 切片的切片依然是对一个数组的引用 |
直接创建切片
1 | a := []int{1,2,3} |
添加元素
1 | // 若添加元素个数不超过cap值,则在原数组修改 |
copy(拷贝)
1 | s1 := []int{0,1,2,3} |
map
定义
1 | m := map[string]int{} // nil |
遍历
1 | // map是无序的hash map,所以遍历时每一次输出的顺序都不一样 |
取值
1 | m := map[string]string{ |
删除(delete)
1 | delete(m,"age") // 删除m中的age |
面对对象
1 | // go语言的面对对象仅支持封装,不支持继承和多态 |
结构体
定义
1 | // 定义一个结构体 |
自定义工厂函数
1 | // 由于没有构造函数,所以可以用工厂函数替代 |
结构体方法
1 | // 结构体方法并不是写在结构体中,而是像函数一样写在外面,他实际上就是定义了[接收对象]的函数 |
封装
1 | // 名字一般用CamelCase(驼峰体) |
包
1 | // 每个目录只有一个包(package) |
继承
1 | go语言没有继承,如何扩展系统类型或者自定义类型呢? |
获取第三方库
1 | // go get xxx 从第官方下载第三方库,需要翻墙 |
接口
定义
1 | type xxx interface{ |
实现
1 | // 结构体不需要显示"实现" 接口,只要定义好方法即可 |
类型
1 | // 查看类型 i.(type) |
约束接口类型: i.(xxx)
1 | var i AnimalInterface // 定义变量 i 是动物接口类型 |
泛型:interface{}
1 | type Queue []int // 定义了一个 int 类型的切片 |
组合
1 | type Cat interface{ |
常用系统接口
1 | // 1. 类似 toString() 的信息打印接口 |
函数式编程
闭包
1 | func add() func(int) int { |
生成器
1 | // 一个斐波那契数列的生成器 |
函数接口
1 | package main |
错误处理与资源管理
defer
1 | func writeFile(filename string) { |
panic与recover
1 | panic: |
1 | // 例一:捕获 panic |
goroutine并发
goroutine
1 | // go func(){}() |
go语言调度器
1 | // go func(){}() |
channel
channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递
定义
1 |
更进一步:channel工厂
1 |
channel 方向(只读与只写)
1 |
缓冲区
向管道中写入就必须定义相应的输出,否则会报错 有缓冲区与无缓冲区的区别是 一个是同步的 一个是非同步的,即阻塞型队列和非阻塞队列 详解:https://blog.csdn.net/samete/article/details/52751227
1 |
关闭管道
1 |
用channel等待任务结束
上面的例子使用 time.Sleep(time.Microsecond)来等待任务结束,不精确且耗时
1 |
用 sync.WaitGroup 等待任务结束
1 | package main |
select
- 有多个 case 语句,只要有一个 case 处于非阻塞可执行状态,就执行,否则一直阻塞
- 如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行
用法
1 |
1 |
定时器
- time.After() 设置一个定时器,返回一个 channel,到一段时间后,向channel发送一条当前时间
- time.Tick() 返回一个 channel,每过一段时间向channel发送一条当前时间
1 | func main() { |