当前位置: 首页 > 科技观察

Golang面试中make和new的用法

时间:2023-03-17 11:04:58 科技观察

在golang中,make和new都是分配内存,但是还是有一些区别的。只有了解了它们之间的区别,才能在合适的场合使用它们。简而言之,new只是分配内存而不初始化它;make分配和初始化内存。所谓初始化就是给一个类型赋初值,比如字符为空,整数为0,逻辑值为false。从Golang官方文档的builtin(内置包)中可以找到make和new的用法。官方文档中内置软件包new的使用介绍:先来看new的定义//new内置函数分配内存。它的第一个参数是类型,而不是值。它的返回值是指向该类型新分配的零值的指针。funcnew(Type)*Type可以看出它的参数是一个类型,返回值是一个指向该类型内存地址的指针,分配的内存会被置零,即该类型的零值,即字符为空,整数为0,逻辑值为false见一些例子typePstruct{NamestringAgeint}vara*[2]intvars*stringvarb*boolvari*intvarps*Pa=new([2]int)s=new(string)b=new(bool)i=new(int)ps=new(P)//structurefmt.Println(a,"",*a)fmt.Println(s,"",*s)fmt.Println(b,"",*b)fmt.Println(i,"",*i)fmt.Println(ps,"",*ps)输出如下:&[00][00]0xc0000821e00xc0000a409afalse0xc0000a40b00&{0}{0}上面的基本类型,我们来看下slice,map和channel类型是如何操作的://map操作varmp*map[string]stringmp=new(map[string]string)//将下面几行注释掉,newmap返回nil,直接使用会panic//*mp=make(map[string]string)//ifthislineisomitted,itwillpan"Pan:assignmenttoentryinnilmap""(*mp)["name"]="lc"fmt.Println((*mp)["呐me"])//切片操作varms*[]stringms=new([]string)//注释掉后面几行时,下标会越界//*ms=make([]string,5)//ifthislineisdeleted,itwill"panic:runtimeerror:indexoutofrange"(*ms)[0]="lc"fmt.Println((*ms)[0])从上面可以看出,silce、map、channel等类型都是引用类型。当引用类型初始化为nil时,nil不能直接分配,也不能用new分配内存。使用make进行分发。make的使用介绍:先看一下make的定义//Themakebuilt-infunctionallocatesandinitializesanoobjectoftype//slice,map,orchan(only)。thetype://Slice:Thesizespecifiesthelength.Thecapacityofthesliceis//equaltoitslength.Asecondintegerargumentmaybeprovidedto//specifyadifferentcapacity;itmustbenosmallerthanthe//length.Forexample,make([]int,0,10)allocatesanunderlyingarray//ofsize10andreturnsasliceoflength0andcapacity10thatis//backedbythisunderlyingarray.//Map:Anemptymapisallocatedwithenoughspacetoholdthe//specifiednumberofelements.Thesize可以省略,在这种情况下//分配一个小的起始大小。//Channel:通道的缓冲区使用指定的//buffercapacity进行初始化。如果为零,或者省略了大小,则通道是//无缓冲的。//slice:size指定它的长度。切片的容量等于它的长度。切片支持第二个整数参数,可用于指定不同的容量;它必须不小于其长度,因此make([]int,0,10)将分配一个长度为0且容量为10的切片。//映射:初始分配的创建取决于大小,但生成的映射的长度为0。大小可以省略,在这种情况下将分配一个较小的起始大小。//Channel:根据指定的缓存容量初始化通道的缓存。如果大小为零或省略,则通道是无缓冲的。funcmake(tType,size...IntegerType)类型可以看出,它返回的是类型本身而不是指针类型,因为make只能为slice、map、channel等初始化内存,而它们返回的是引用类型,所以有不需要返回指针让我们看一些make例子:mm:=make(map[string]string)mm["name"]="lc"fmt.Println(mm["name"])mss:=make([]int,2)mss[0]=100fmt.Println(mss[0])ch:=make(chanint,1)ch<-100fmt.Println(<-ch)总结:make只是用来分配和初始化slice,map和chan类型的数据。new可以分配任何类型的数据。newallocation返回一个指针,它是Type*Type。make在make分配的空间之后返回Type的引用,清除并初始化new分配的空间。