回答

收藏

new()和make之间的区别

技术问答 技术问答 254 人阅读 | 0 人回复 | 2023-09-12

许多段落解释了许多段落解释之间的区别new()和make(),但在实践中,你可以在当地创建物体并返回它们。
: v7 l; p$ U% }; n为什么要使用这对分配器?
) @1 H0 b$ H( i' `9 o0 ]                                                                / {. N7 Z5 m4 M; O! `0 L0 \8 t4 n
    解决方案:                                                               
" @6 t* n& q/ d                                                                Go 内存分配和值初始化的方法有很多:
; Y2 T- d' N5 A) l/ L' Z&T{...}`,`&someLocalVar`,`new`,`make分配也可能发生在创建复合文本时。
) q* |  L# _/ K4 A& Ynew可用于分配整数等值,&int是非法的:
  R8 Q+ i0 w4 M9 q9 H9 e
    new(Point)&oint     OK&oint / Combines allocation and initializationnew(int)&int          // Illegal// Works,but it is less convenient to write than new(int)var i int&i
    ; G. Q( T- N  a
通过查看以下示例可以看出new和之间的区别make:
7 Z/ r0 m+ a' ^3 G5 I% F- R
    p := new(chan int)   // p has type: *chan intc := make(chan int)  // c has type: chan int
    * k, i3 s4 W  x4 T
假设 Go 没有newand make,但它具有内置函数NEW。示例代码将如下所示:; E4 I9 E9 I+ U
    p := NEW(*chan int)  // * is mandatoryc := NEW(chan int)2 m3 k% N: @& ?9 N
该* 会是强制性的,所以:0 r1 h$ x- w. T$ g) T5 t' ~. M- M
    new(int)        -->  NEW(*int)new(Point)      -->  NEW(*Point)new(chan int)   -->  NEW(*chan int)make([]int,10) -->  NEW([]int,10)new(Point)  // Illegalnew(int)    // Illegal' A* U4 Y' v) K0 j8 P* l9 p; h* }
是的,可以new和合并make单个内置函数。然而,与两个内置函数相比,单个内置函数可能会导致新 Go 程序员更困惑。
( f8 D# Z, k* u3 Q( I7 Q8 ~3 p考虑到上述所有要点,似乎更合适new并make保持分离。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则