雨痕 Go语言学习笔记-进阶

内存布局

  1. string是指针,指向底层byte数组
  2. slice是指针类型,slice由3部分组成:底层数组指针,len,cap
  3. interface也是指针类型,由两部分组成:
    • *Itab,表明指针对应数据的类型
    • *data,指向指针代表的数据
  4. new,创建对象,返回指针
  5. make,只初始化slice,channel,map。返回值不是指针,但是slice,map,channle是指针类型:
    • slice:包含指针,len,cap的slice对象
    • map,指针包装的对象
    • channel:指针包装的对象

指针陷阱

  1. 对象内存分配会受编译参数影响。举个例⼦,当函数返回对象指针时,必然在堆上分配。

    可如果该函数被内联,那么这个指针就不会跨栈帧使⽤,就有可能直接在栈上分配,以实

    现代码优化目的。因此,是否阻⽌内联对指针输出结果有很⼤影响而在栈上复制小对象其实非常快,所以如果不是特别大的对象或确实需要修改原对象,一般不需要传指针参数

反射 reflect

  1. 字段标签可实现简单元数据编程,⽐如标记 ORM Model 属性
  2. 需要注意, Value 某些⽅法没有遵循 "comma ok" 模式,⽽是返回 ZeroValue,因此需要⽤ IsValid 判断⼀下是否可⽤
  3. Make New利⽤ Make,New 等函数,可实现近似泛型操作

总结

进阶部分重点讨论了反射、指针

comments powered by Disqus