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中对有名变量的操作与函数最终返回值有关,否则无关。
网友评论