当前位置:网站首页>Golang切片make与new的区别
Golang切片make与new的区别
2022-07-26 22:39:00 【everyD_struggle】
- new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为
*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于&T{}。 - make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel

在上图中:
var p *[]int = new([]int) // *p == nil; with len and cap 0
p := new([]int)
在第二幅图中, p := make([]int, 0) ,切片 已经被初始化,但是指向一个空的数组。
以上两种方式实用性都不高。下面的方法:
var v []int = make([]int, 10, 50)
或者
v := make([]int, 10, 50)
这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素。
如何理解new、make、slice、map、channel的关系?
slice、map以及channel都是golang内建的一种引用类型,三者在内存中存在多个组成部分, 需要对内存组成部分初始化后才能使用,而make就是对三者进行初始化的一种操作方式
new 获取的是存储指定变量内存地址的一个变量,对于变量内部结构并不会执行相应的初始化操作, 所以slice、map、channel需要make进行初始化并获取对应的内存地址,而非new简单的获取内存地址
边栏推荐
猜你喜欢
随机推荐
程序员必做50题
Inherit, inherit, inherit
Crop TIF image
【4.2 约数】
[NCTF2019]SQLi
Elaborate on the differences and usage of call, apply and bind 20211031
SSRF explanation and burp automatic detection SSRF
【Codeforces Round #807 (Div 2.) A·B·C】
当事务遇上分布式锁
Mysql互不关联的联表查询(减少了查询的次数)
MySQL associative table queries (reducing the number of queries)
蓝桥杯 1004 [递归]母牛的故事
2020-12-20 99 multiplication table
Use of postman
[漏洞实战] 逻辑漏洞挖掘
[By Pass] WAF 的绕过方式
箭头函数详解 2021-04-30
JSCORE day_04(7.5)
[ciscn2019 North China division Day1 web2]ikun
2022.7.14DAY604


![[NPUCTF2020]ezinclude](/img/24/ee1a6d49a74ce09ec721c1a3b5dce4.png)



![[CTF攻防世界] WEB区 关于Cookie的题目](/img/96/6e91ee19343a1ddc49dc2bc94cba62.png)
![[watevrCTF-2019]Cookie Store](/img/24/8baaa1ac9daa62c641472d5efac895.png)

