一、规范
- 行长一般不超过80个字符
- package的命名和目录一致
- 变量命名用驼峰, 首字母大写包外可见,小写包内可见
- import: 标准库, 项目包, 第三方包的包顺序, 空行隔开; 路径用绝对路径
- struct申明和初始化格式采用多行
二、语法
- 常量: iota 自增常量
- 基础类型: 可以以自己数组下标的方式去获取一个字符串的指定字符
- 数组:new操作来创建指向数组的指针; 可以用==进行比较; 长度固定
- Slice: 理解为动态数组, append. var a []int , 引用类型, 通过下标获取指定范围的 元素
- Map: 键值对, 快速索引, 无序, hash实现
- 函数: 指针/切片传参改变值,不定参数 a …interface{} a…
- 匿名函数:不定义函数名的函数实现方式。
- 闭包:函数里嵌套匿名函数, 匿名函数可以使用函数里定义的变量(非匿名函数内定义)
- defer的使用
defer func(){defer d.close()}
- 包:首字母大写的名称才能被导出,供包外代码访问; 会优先执行init函数(初始化操作放这)
- 面向对象: 结构体+方法实现类; 通过匿名组合的方式实现”继承”
type Camera struct{ V1 string } func (c *Camera) TakePicture() string { return "Click" } type CameraPhone struct{ Camera } var cp CameraPhone func test() { cp.TakePicture() }
- Interface{}:断言
var x interface{} value, ok := x.(string) x.(type)
- Channel: 需要初始化,定义缓冲区长度
三、特性
1. 并发机制
goroutine + chan, chan分为无缓冲chan和有缓冲 chan(线程安全的队列)
2. 并发底层支持
G + P + M 用户线程-> 内核线程。
G并发执行的任务的封装(用户态线程, 运行大量创建,上下文切换成本低等特点), P管理G队列, M通过系统调用创建的线程实体
代码实现:
1. 定义类
2. Tick
3. Push to chan
4. For{
Select{
Case 1:
reload config
Case chan:
read from chan
Case ticker.C(chan):
deal, judge break condition
四、调试
dlv
./dlv attach [pid]
goroutine(s)
b
p
n
五、性能分析
pprof, 支持查看调用栈、内存使用等