用new和make生成的对象和直接用结构体定义生成的对象有区别吗?

比如说,我在函数里生成了一个对象,这个对象是某个二叉树的一个节点,或者切片的一个成员。

然后我们返回的是二叉树的根节点或者切片本身

那么使用&Struct{}可以吗?会不会建立在栈上而导致出错,

我知道使用new应该是没问题的。

共 6 个回复


tsotsi

new 应该和 &Struct{}一个意思吧

# 0

mint

在我的实际使用过程中,new 和 &所达到的效果是一样的,不同的是new默认初始化,&可以自定义初始化

# 1

David

在 Go 里面,应该&Struct{} 会比用 new 好。 用 &Struct{} 编译器在合适的时候,还会考虑从栈上分配内存从而提高效率,如果不行(有 escape),则会自动在栈上分配。用 new 的话不确定有这个优化。

# 2

snake117

@David 我就是担心这个优化是否会导致变量重用。

我记得go1.0.2还是go1.2的时候,就出现这个问题,二叉树的节点变量重用了。

# 3

David

当然不会啦,否则就是优化的 bug 了,bug 迟早会被改掉的。

你说的这个问题,还有一种可能是你的别的地方出错了,能贴贴你的代码么?

# 4

snake117

@David 好久之前的代码了,源代码早就丢了,我只记得是从go游戏场里那个遍历树的章节,自己实现的时候出现的。

# 5