我们知道,goroutine 的堆栈可以通过复制 go1.4 中的堆栈来增加。我的问题是,是否有必要在 go 中避免堆栈上的局部变量过大?例如func foo(){ var buf [8096]int //do something with buf}或者var buf [8096]intfunc foo(){ //do something with buf}我的意思是,是否有必要使用后一个示例来避免由于堆栈复制而导致的大变量?
2 回答
千万里不及你
TA贡献1784条经验 获得超9个赞
堆栈几乎总是比堆快。在哪里定义变量更多的是关于范围。由于 Go 是后一个示例中的词法范围语言,因此您弄脏了全局命名空间,使 var buf 在程序中的任何地方都可见。这是语义差异。所以你最好在语义上做正确的事情。
GCT1015
TA贡献1827条经验 获得超4个赞
如果您不想在堆栈中重新分配另一个大对象,您应该使用指针而不是全局变量。至于 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]
}
注意:这不适用于切片;切片总是作为参考传递。
- 2 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消