- 依赖的概念
- 依赖管理的三个阶段 GOPATH,GOVENDOR,go mod
- 每个项目有一个自己的vendor目录,存放第三方库
- 大量第三方依赖管理工具:glide,dep,go dep,...
- 初始化:go mode init
- 增加依赖:go get
- 更新依赖:go get[@v...],go mode tidy
- 项目迁移到go mode:go mode init,go build ./...
- duck typing
- 描述事物的外部行为而非内部结构
- go属于结构化类型系统,类似 duck typing
- 接口变量 包含 实现者的类型 实现者的值(指针)自带指针
- 接口变量同样采用值传递,几乎不需要使用接口的指针
- 指针接收者实现只能以指针方式使用,值接受者都可
- 查看接口变量
- 标识任何类型:interface{}
- Type Assertion
- Type Switch
- 特殊接口
- Stringer
- Reader/Writer
- 函数是一等公民:参数,变量,返回值都可以是函数
- 高阶函数
- 函数 -> 闭包
- 不可变性:不能有状态,只有常量和函数
- 函数只能有一个参数
- go语言闭包的应用
- 更为自然,不需要修饰如何访问自由变量
- 没有lambda表达式,但是有匿名函数
- 确保调用在函数结束时发生
- 参数在defer语句时计算
- defer列表为后进先出
- 何时使用defer 调用
- Open/Close
- Lock/Unlock
- PrintHeader/PrintFooter
- 停止当前函数执行
- 一直向上返回,执行每一层的defer
- 如果没有遇见recover,程序就退出
- 仅在defer调用中使用
- 获取panic的值
- 如果无法处理,可重新panic
- 意料之中:使用error。如文件打不开
- 意料之外的:使用panic。如:数组越界
- 轻量级"线程"
- 非抢占式多任务处理,有协程主动交出控制权(1.4后优化成可以抢占式)
- 编译器/解释器/虚拟机层面的多任务
- 多个协程可能在一个或多个线程上运行
* I/O,select
* channel
* 等待锁
* 函数调用(有时)
* runtime.Gosched()
- channel
- buffered channel
- range
- 用循环创建二维slice
- 使用slice来实现队列
- 用Fscanf 读取文件
- 对Point的抽象
- gin-gonic/gin
- middleware的使用
- context的使用
goctl model mysql datasource -url="developer:KvB4dSql@tcp(evcard-st-wan.mysql.rds.aliyuncs.com:3306)/vlms_assets" -table="t_assets_vehicle" -dir="./model"