美文网首页go
new和make的区别?

new和make的区别?

作者: 草莓2020 | 来源:发表于2021-07-01 20:21 被阅读0次

    它们都是内置函数,new按指定类型长度分配零值内存,返回指针,并不关系类型内部构造和初始化方式。而引用类型则必须使用make函数创建,编译器会将make转化为目标类型专用的创建函数(或指令),以保证完成全部内存分配和相关属性初始化。

    new可以为引用类型分配内存,但这是不完整创建。以字典(map)为例,它仅分配了字典类型本身(实际就是个指针包装)所需内存,并没有分配键值存储内存,也没有初始化散列桶等内部属性,因此它无法正常工作。

    p := new(map[string]int) // 函数new返回指针
    m := *p
    m["a"] = 1 // panic: assignment to entry in nil map (运行期错误

    使用make初始化引用类型

    切片的存储形式 unsafe.pointer len cap
    只声明不赋值时

    image

    使用make初始化时 会分配底层数组


    image

    使用new初始化引用类型

    使用new初始化引用类型 (new的返回值就是slice结构的起始地址,不会分配底层数组,所以此时赋值时不允许的)

    image

    使用append的方式添加元素,可以分配底层数组

    image

    参考:【Golang】slice类型存什么?make和new?slice和数组?扩容规则?_哔哩哔哩_bilibili

    相关文章

      网友评论

        本文标题:new和make的区别?

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