美文网首页
Go - 常见问题

Go - 常见问题

作者: kyo1992 | 来源:发表于2021-05-27 11:22 被阅读0次

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

    相关文章

      网友评论

          本文标题:Go - 常见问题

          本文链接:https://www.haomeiwen.com/subject/uqdyjltx.html