我们知道,通过在go1.4中复制堆栈,goroutine的堆栈可能会增加。我的问题是,是否有必要在堆栈中避免过大的局部变量? 例如
func foo(){
var buf [8096]int
//do something with buf
}
或
var buf [8096]int
func foo(){
//do something with buf
}
我的意思是,是否有必要使用后一个例子来避免因堆栈复制而导致的大变量?
答案 0 :(得分:2)
堆栈几乎总是比堆快。定义变量的位置更多是关于范围的。由于Go是后一个示例中的词法范围语言,因此您将整个全局命名空间弄脏,使得var buf在程序中的任何位置都可见。它的语义差异。所以你最好做一些语义正确的事情。
答案 1 :(得分:0)
如果您不想在堆栈中重新分配另一个大对象,则应使用指针而不是全局变量。至于go1.4,这段代码有效:
package main
import "fmt"
func do(v *[3]int) {
v[1] = 99
}
func main() {
var r [3]int
do(&r)
fmt.Println(r)
//Prints [0 99 0]
}
如果不使用指针,则会失败,因为数组是作为值传递的,而不是引用:
package main
import "fmt"
func do(v [3]int) {
v[1] = 99
}
func main() {
var r [3]int
do(r)
fmt.Println(r)
//Prints [0 0 0]
}
注意:这不适用于切片;切片总是作为参考传递。