Go - 常见问题

make和new

  • new(T) 和 make(T, args) 是Go语⾔内建函数,⽤来分配内存,但适⽤的类型不⽤。
  • new(T) 会为了 T 类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T 的
    值。换句话说就是,返回⼀个指针,该指针指向新分配的、类型为 T 的零值。适⽤于值类型,如数组 、 结构体 等。
  • make(T, args) 返回初始化之后的T类型的值,也不是指针 *T ,是经过初始化之后的T的引⽤。
  • make() 只适⽤于 slice 、 map 和 channel 。

函数传值问题

Go只有值传递,没有引用传递的。
map,chan,slice是引用类型,作为参数传递后修改,会改变其指向内存的值。
而slice作为参数传递,实际上是把整个slice结构体拷贝一次,但因为内部保存了引用数组的指针,所以也可以修改其指向内存的值。
注意引用类型和传引用是两个概念,想修改原内容数据,就要传递引用类型,即map,chan,slice或原内容数据的指针。

defer与return

主要是 无名返回值和命名返回值return返回的差异
defer、return、返回值三者的执行顺序应该是:return最先给返回值赋值;接着defer开始执行一些收尾工作;最后RET指令携带返回值退出函数。
如果是无名返回值,defer中的操作与函数最终返回值无关;
如果是有名返回值,且在函数体中是直接给有名变量赋值,而defer中对有名变量的操作与函数最终返回值有关,否则无关。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容