golang2021数据格式(90)new与make差异

golang2021数据格式(90)new与make差异

 

Go 语言中的 new 和 make 一直是新手比较容易混淆的东西, 咋一看很相似.不过解释两者之间的不同也非常容易. 他们所做的事情,和应用的类型也不相同. 二者都是用来分配空间.

Go语言中new和make是内建的两个函数,主要用来创建分配类型内存. 在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用.

1. new

new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回的是新值的地址,也就是 T 类型的指针 *T,该指针指向 T 的新分配的零值.

new要点

2. make

make(T, args) 返回的是初始化之后的 T 类型的值,这个新值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用. make 也是内建函数,您可以从 http://golang.org/pkg/builtin/#make 看到它, 它的函数原型 比 new 多了一个(长度)参数,返回值也不同.

make 只能用于 slice,map,channel 三种类型, 并且只能是这三种对象. 和 new 一样,第一个参数是 类型,不是一个值. 但是make 的返回值就是这个类型(即使一个引用类型),而不是指针.具体的返回值,依赖具体传入的类型.

3. 总结

下图给出了区别:

new和make区别代码:

package main

import "fmt"

func main() {
    p := new([]int) //p == nil; with len and cap 0
    fmt.Println(p)

v := make([]int, 10, 50) // v is initialed with len 10, cap 50
    fmt.Println(v)

/*********Output****************
        &[]
        [0 0 0 0 0 0 0 0 0 0]
    *********************************/

(*p)[0] = 18        // panic: runtime error: index out of range
                        // because p is a nil pointer, with len and cap 0
    v[1] = 18           // ok
   
}


golang2021数据格式(90)new与make差异


展开阅读全文

页面更新:2024-04-15

标签:可能会   下图   原型   初始化   指针   变量   函数   差异   分配   区别   内存   参数   类型   语言   地址   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top