400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

go语言中的new与make有什么区别-创新互联

本篇内容主要讲解“go语言中的new与make有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中的new与make有什么区别”吧!

成都创新互联专注于青县网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供青县营销型网站建设,青县网站制作、青县网页设计、青县网站官网定制、重庆小程序开发服务,打造青县网络公司原创品牌,更为您提供青县网站排名全网营销落地服务。

new() 和 make() 的区别

以下摘录自 https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.2.md

二者都在堆上分配内存,但是它们的行为不同,适用于不同的类型。

new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于&T{}。make(T)返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel

换言之,new 函数分配内存,make 函数初始化;下图给出了区别:

我的理解,new返回一个变量的指针,但是这个指针指向空,你不可以直接对该指针进行操作,否则会报错,除非你将该指针指向一个该类型变量的地址。
make返回一个该类型的变量,以切片变量为例,上面提到,make适用于创建切片、map和channel,但new也可以创建

package mainimport "fmt"func main() {//使用make创建切片,返回的是变量本身s1 := make([]int,5,10)fmt.Printf("use make create slise type %T value %v \n",s1,s1)s1[0] = 123s1[4] = 321fmt.Printf("make s1 type %T value %v \n",s1,s1)//# 使用new 创建切片,返回的是切片变量的指针s2 := new([]int)fmt.Printf("use new create slise type %T value %v \n",s2,s2)fmt.Printf("new s2 type %T value %v \n",*s2,*s2)// 想要赋值的话需要使用*解引用// 这里虽然不报语法错误,但是如果尝试直接使用(*s2)[0] = 123的话会有运行时错误,// panic: runtime error: index out of ranges2 = &s1 //需要将变量指针指向一个该类型变量的地址(*s2)[0] = 123(*s2)[4] = 3211fmt.Printf("new s2 type %T value %v \n",s2,s2)//s2的修改也会影响s1fmt.Printf("s1 type %T value %v \n",s1,s1)m1 := make(map[string]string)m1["name"] = "yangyanxing"m1["age"] = "30"fmt.Printf("m1 use make create type:%T value %v \n",m1,m1)m2 := new(map[string]string)fmt.Printf("m2 use new create type:%T value %v \n",m2,m2)//直接赋值会报 panic: assignment to entry in nil mapm2 = &m1(*m2)["name"] = "fan"//对m2的修改也会影响到m1fmt.Printf("after m2 change m1 value is %v",m1)}

输出结果为

use make create slise type []int value [0 0 0 0 0]make s1 type []int value [123 0 0 0 321]use new create slise type *[]int value &[]new s2 type []int value []new s2 type *[]int value &[123 0 0 0 3211]s1 type []int value [123 0 0 0 3211]m1 use make create type:map[string]string value map[name:yangyanxing age:30]m2 use new create type:*map[string]string value &map[]after m2 change m1 value is map[name:fan age:30]

map的初始化

map有以下两种初始化方法

到此,相信大家对“go语言中的new与make有什么区别”有了更深的了解,不妨来实际操作一番吧!这里是创新互联建站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


文章标题:go语言中的new与make有什么区别-创新互联
本文地址:http://mbwzsj.com/article/dsdpeo.html

其他资讯

让你的专属顾问为你服务