回答

收藏

new()和make之间的区别

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

许多段落解释了许多段落解释之间的区别new()和make(),但在实践中,你可以在当地创建物体并返回它们。
/ [* ^- Z7 D: p" Z; R- P! t为什么要使用这对分配器?' p( l; J, ^7 Y+ h
                                                               
9 g: R) a: n" m    解决方案:                                                                9 o* U3 l1 X2 q/ D/ B
                                                                Go 内存分配和值初始化的方法有很多:
8 x2 \# |0 y% b! w&T{...}`,`&someLocalVar`,`new`,`make分配也可能发生在创建复合文本时。2 J  ?; T6 N0 A4 {& P7 r8 |
new可用于分配整数等值,&int是非法的:
4 }1 B$ ]- A$ w. F4 N, 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/ G* ^' r) _" l: A; D$ H& }
通过查看以下示例可以看出new和之间的区别make:" P' G- r0 X! l7 B  P" Z6 y5 X) A
    p := new(chan int)   // p has type: *chan intc := make(chan int)  // c has type: chan int( Z7 J2 h2 E2 ~  ?4 W$ c
假设 Go 没有newand make,但它具有内置函数NEW。示例代码将如下所示:* S  E& Y7 h4 R& G9 t
    p := NEW(*chan int)  // * is mandatoryc := NEW(chan int)# l, v0 U; R2 S- e$ N# L8 a' _6 w
该* 会是强制性的,所以:, E1 M1 h) Y: m/ L! ~
    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
    ) I# p' Y$ K" F. P+ ^2 _9 K
是的,可以new和合并make单个内置函数。然而,与两个内置函数相比,单个内置函数可能会导致新 Go 程序员更困惑。$ i" d6 |3 t2 M7 u3 E- k
考虑到上述所有要点,似乎更合适new并make保持分离。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则