Golang Go语言中 new 关键字存在的意义是什么?

初学 Go 产生的疑问:

type Counter struct{...}

ctr := new(Counter) //1 ctr := &Counter{} //2

写法 2 完全可以取代写法 1 的话, 为什么还要引入 new 这个关键字?


Golang Go语言中 new 关键字存在的意义是什么?
19 回复

更多关于Golang Go语言中 new 关键字存在的意义是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


然而,这文档并没有回答这个问题

可以从汇编后的指令来找找区别

我好像没用过 new。

new int 这种,也许…

new prod reference,&取地址值,

一般编译器会给你自动处理,第一种写法是意义明确,第二种是编译器自动 new 了

谢谢, 不过例子看起来是个很牵强的用法…
姑且这样认为吧. 谢谢.

第二种是你自己已经手动的生产了一个实例的意思,然后取其地址!

内建类型明显就用不了第二种了啊。

new 只是语法糖,不要拿汇编代码当证据,汇编只是一种实现而已。new 主要针对非结构体类型,缺点是没办法设置初始值,多年前提过 issue 建议加第二个可选参数,就看 Go2 是否能改进了

明白. 只是觉得内建类型很少会这样用.
一方面, Go 尽量节省关键字, 比如没有 while 而用 for 代替, 另一方面却整出个没多大用处的 new, 而且语义上和传统的面向对象的 new 关键字不一样, 更像是 malloc.

1 是直接分配到堆上
2 会涉及到逃逸检测,看最终是分配到栈还是堆上

有出处吗?

你确定 写法 2 完全可以取代写法 1 ?

语法糖吧

在Go语言中,new 关键字具有特定的意义和用途,它是用于分配内存的基础工具之一,但其使用场景和语义相比其他编程语言中的类似机制(如C++中的new操作符)有所简化。

new 关键字的主要作用是分配一块足够存储指定类型的零值的内存空间,并返回指向这块内存的指针。这里需要注意的是,new 只会分配内存并初始化为零值,它不会调用类型的构造函数(如果有的话)。因此,new(T) 的结果是 *T 类型的,即一个指向类型 T 的零值的指针。

new 的存在意义在于它提供了一种简洁的方式来分配内存并获取指针,这在某些低级编程场景中非常有用,比如当你需要直接操作内存或需要明确地传递指针时。然而,在Go的日常编程中,new 并不是最常用的内存分配方式,因为Go更倾向于使用 make 函数来分配和初始化内建的引用类型(如切片、映射和通道),以及通过结构体的字面量来初始化结构体。

总的来说,new 在Go语言中是一个基础但较为低级的工具,它提供了一种直接分配内存并获取指针的方法,但在大多数情况下,Go程序员更倾向于使用更高级的内存分配和初始化机制。

回到顶部