981377660LMT / ts

ts学习
6 stars 1 forks source link

golang 知识点 #150

Open 981377660LMT opened 1 year ago

981377660LMT commented 1 year ago
  1. 注意类型别名与类型定义的区别
  2. 只有接口类型才可以使用类型选择
  3. nil 只能赋值给指针、chan、func、interface、map 或 slice 类型的变量
  4. 可变参数是 mutable 的
  5. Go 中的数组是值类型,可比较,另外一方面,数组的长度也是数组类型的组成部分,所以 a 和 b 是不同的类型,是不能比较的,所以编译错误。
  6. 当且仅当接口的动态值和动态类型都为 nil 时,接口类型值才为 nil。
  7. 永远不要使用一个指针指向一个接口类型,因为它已经是一个指针。
  8. 在 encode/decode JSON 数据时,Go 默认会将数值当做 float64 处理。
  9. 为什么小对象多了会造成 gc 压力 通常小对象过多会导致 GC 三色法消耗过多的 GPU。优化思路是,减少对象分配。
  10. golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个 case 语句里必须是一个 IO 操作,确切的说,应该是一个面向 channel 的 IO 操作。
  11. float 型可以作为 key,但是由于精度的问题,会导致一些诡异的问题,慎用之。
  12. 无法对 map 的 key 或 value 进行取址
  13. 如果迭代的元素内存占用较高,例如一个包含很多属性的 struct 结构体,那么 for 的性能将显著地高于 range,有时候甚至会有上千倍的性能差异。对于这种场景,建议使用 for,如果使用 range,建议只迭代下标,通过下标访问迭代值,这种使用方式和 for 就没有区别了。
  14. 编译器决定内存分配位置的方式,就称之为逃逸分析(escape analysis)。
  15. 如何利用逃逸分析提升性能 传值 VS 传指针 传值会拷贝整个对象,而传指针只会拷贝指针地址,指向的对象是同一个。传指针可以减少值的拷贝,但是会导致内存分配逃逸到堆中,增加垃圾回收(GC)的负担。在对象频繁创建和删除的场景下,传递指针导致的 GC 开销可能会严重影响性能。 一般情况下,对于需要修改原对象值,或占用内存比较大的结构体,选择传指针。对于只读的占用内存较小的结构体,直接传值能够获得更好的性能。
981377660LMT commented 1 year ago
  1. 空结构体可以做namespace