你有一个带参数的函数,一个指向类型的指针。
type bar struct{...}
func foo(arg *bar)
有什么区别:
var b bar
foo(&b)
和
b := new(bar)
foo(b)
使用 new 创建分配。
在某些情况下存在差异。new(T)
,顾名思义,返回一个类型为 T 的新实例,whilevar b T
是一个单一实例,一次且永远(错误,实际上直到其生命周期结束 == 超出范围,无法访问......)。
考虑这个循环
var b bar
for i := 0; i < 10; i++ {
foo(&b)
}
对比
var b *bar
for i := 0; i < 10; i++ {
b = new(b)
foo(b)
}
在后一种情况下,foo
例如,如果将其存储arg
在某个容器中,则会导致 10 个bar
存在实例,而前一种情况只有一个变量b
。
另一个区别在于性能。该变量b
将是一个完全静态的全局变量,或者通常位于某些函数/方法调用记录中的静态已知偏移量(通常是堆栈帧的花哨名称)。new
OTOH,如果没有被编译器优化,是一个内存分配器调用。这样的调用将花费一些非零时间。如果在循环中进行并且实际上没有必要,那么它可能会使某些代码路径明显变慢。