go语言精华

Posted by jabin on December 21, 2018

一、规范

  1. 行长一般不超过80个字符
  2. package的命名和目录一致
  3. 变量命名用驼峰, 首字母大写包外可见,小写包内可见
  4. import: 标准库, 项目包, 第三方包的包顺序, 空行隔开; 路径用绝对路径
  5. struct申明和初始化格式采用多行

二、语法

  1. 常量: iota 自增常量
  2. 基础类型: 可以以自己数组下标的方式去获取一个字符串的指定字符
  3. 数组:new操作来创建指向数组的指针; 可以用==进行比较; 长度固定
  4. Slice: 理解为动态数组, append. var a []int , 引用类型, 通过下标获取指定范围的 元素
  5. Map: 键值对, 快速索引, 无序, hash实现
  6. 函数: 指针/切片传参改变值,不定参数 a …interface{} a…
  7. 匿名函数:不定义函数名的函数实现方式。
  8. 闭包:函数里嵌套匿名函数, 匿名函数可以使用函数里定义的变量(非匿名函数内定义)
  9. defer的使用
    defer func(){defer d.close()}
    
  10. 包:首字母大写的名称才能被导出,供包外代码访问; 会优先执行init函数(初始化操作放这)
  11. 面向对象: 结构体+方法实现类; 通过匿名组合的方式实现”继承”
    type Camera struct{
    V1 string
    }  
    func (c *Camera) TakePicture() string { 
    return "Click"
    }          
    type CameraPhone struct{
    Camera
    }       
    var cp CameraPhone
    func test()  {
    cp.TakePicture()
    }
    
  12. Interface{}:断言
    var x interface{}    
    value, ok := x.(string)   
    x.(type)
    
  13. 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, 支持查看调用栈、内存使用等