回答

收藏

new()和make之间的区别

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

许多段落解释了许多段落解释之间的区别new()和make(),但在实践中,你可以在当地创建物体并返回它们。
. W; k( O* A4 C8 I* \1 i为什么要使用这对分配器?. p5 b- ]* R2 O8 ~& E1 ^! u1 C
                                                               
; `; D8 U5 A! r* b9 Q    解决方案:                                                                ; `5 \! [' |: @& N# ?% J0 X  h2 ?
                                                                Go 内存分配和值初始化的方法有很多:6 \- c; I+ y' n
&T{...}`,`&someLocalVar`,`new`,`make分配也可能发生在创建复合文本时。& I1 t5 ~$ P6 P7 N
new可用于分配整数等值,&int是非法的:
7 @7 k. w* t4 I  J5 [+ C9 Y( h8 A! Y" q
    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
    - A, C: U4 _- z' C9 _
通过查看以下示例可以看出new和之间的区别make:" j3 [5 E7 Q- `6 H( g( t
    p := new(chan int)   // p has type: *chan intc := make(chan int)  // c has type: chan int
    & Y- c" J2 E, R/ j
假设 Go 没有newand make,但它具有内置函数NEW。示例代码将如下所示:
6 h) R% v: ?/ _5 g' t$ Y! b
    p := NEW(*chan int)  // * is mandatoryc := NEW(chan int)- `1 X! ?$ _( H; e) H% ]
该* 会是强制性的,所以:& L1 ^# O; e9 c$ x
    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) V0 S4 i. M8 T9 T$ H$ j
是的,可以new和合并make单个内置函数。然而,与两个内置函数相比,单个内置函数可能会导致新 Go 程序员更困惑。, F7 Y& U: f$ @  q1 Y" E
考虑到上述所有要点,似乎更合适new并make保持分离。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则