#关于《Go语言学习笔记》这本书
书如其名,真的算是一本笔记,书中大量篇幅都是代码块,文字介绍较少,基础理论内容也很少,
更多的是对某一些特性和一些用法上做实践,并且如果你细读的话也会发现一些写错的地方。
如果非要嗑这本书 建议先看一遍**《Go by Example 中文版》**,对基本使用和语法有一定了解后再嗑
笔者下卷部分并没有继续看,因为感觉还不到看源码的时候,所以再深造一段时间在回来看一下。
这里粗略的整理一下知识点,没时间看这本书,可以看一下笔者整理的部分,并不全,也只是针对笔者感兴趣的地方进行了整理
- defer 延迟操作 无论函数是否发生异常 都会在return后执行
- 类型别名写法 type myInt = int 类型定义写法 type myInt int
注:类型定义与原始类型无关且不会继承原类型方法 需要强转后才能相互操作 - 不能前置自增 ++a 不能将自增作为表达式 if(a++)>0
- const 常量不能使用取址操作 const a int -> &a
- 指针指向同一个地址 或者 都为 nil 两个指针相等
- 当给复合类型赋值时 需要遵守以下规则
- 必须带有类型名称 var a struct=struct{}
- {必须紧跟类型后 且在一行
- 值以 , 隔开
- 多行情况 尾值以, 或者} 结尾
- 使用 for range 的时候 for域内将会使用复制后的目标数据,for域内对目标数据操作 不会影响下一次取值,但会影响for域外的目标数据
- 使用 for range 后的参数如果是方法 那么该方法也只会获取一次
- break continue 也可以像 goto 一样增加跳转位置
- 函数 不支持方法重载,不支持默认参数 ,支持多返回(这点很有意思)
- 函数采用值拷贝 包括指针类型也是
- 返回值命名后可以在方法体中当变量使用 最后直接return 无需带返回值 很方便
- 延迟调用 包括注册和调用,并增加额外的缓存开销,所以性能较直接调用偏低一点
- panic和recover是 内置函数 类似于try catch 操作 panic 引发一个错误 recover读取最后一个错误。recover只能在延迟函数 defer 中使用
- 可以将string看作是byte数组,两者引用地址是相同的,string为只读类型,所以其操作大多需要重新分配内存地址,当有大量使用追加操作,损耗因能严重,并产生相当多的垃圾,建议使用strings.Join或者bytes.Buffer,少量转换可以使用fmt.Sprintf或text/template,或者提前创建好较大存储空间的数组将字符插入
- 类型相同但长度不同的数组属于不同类型
- 定义数组时,可以使用 … 作为第一维的长度,记作运行时自动定义长度
- 数组的赋值或传参使用复制后的数据,修改不影响源数据,可通过切片和指针操作修改源数据
- 切片类型不支持比较操作,(且不能使用指针直接访问元素????????)
- 切片的Cap可以理解为预计长度,当元素个数超过cap,cap会变为原cap的两倍,当cap较大的时候可能会变成1/4节省内存,切片虽然优势很多 但也绝不是替换数组的利器,小数组在栈上的拷贝不一定大于make的代价,切片有可能将数据分配至堆上
- map使用无地址化,所以结构体和数组 无法直接通过value进行操作 需要引用后重新赋值或只用指针类型
- map允许在迭代中新增或修改源
- 当使用匿名结构体做内部属性的时候 不能在结构体初始化的时候对匿名结构体内部的属性进行赋值,只能通过外部结构体属性的形式进行赋值
- 结构体可以使用指针直接操作属性,不需要再使用*指定
- 空结构体常用于管道通信,代表事件触发
- 匿名字段 更像是继承关系,除了接口指针和多级指针都可以做匿名字段,不能将类型和该类型指针同时作为匿名字段,因为名字相同
- 方法用于对结构体的数据操作扩充,当需要修改原始数据使用T,小对象无操作使用T,引用对象,字符串,函数等指针包装使用T,大结构体使用T,需要线程同步的使用T,不确定的时候使用T
- 使用匿名字段的组合套用可以实现类似于 多态,方法重载等的效果
- 当一个结构体的方法被当作属性进行传递的时候,结构体会在定义方法属性时保留当前值传递给方法,即使结构体使用指针也是一样得效果,除非方法使用指针
- 使用.(T)进行类型转换 ,由于使用ok-idiom模式,所以即使转换失败也不会出现panic
- 协程与延迟调用一样 在计算前复制当前参数
- 可以通过定义一个以空结构体作为参数的管道控制线程等待 exit:=make(chan struct{})
- 使用GOMAXPROCS设置最多线程并行数,小于1 则返回当前默认值,即cpu个数
- 使用Gosched暂停当前线程,下次调度时恢复 。Goexit立即停止当前线程,不终止延迟调用
- 使用cap,len函数判断通道是异步还是同步,同步都返回0,异步至少cap不为0
- 管道在阻塞状态下不会被GC清理