面试题答案
一键面试- 返回局部变量指针:
package main
func createString() *string {
s := "hello"
return &s
}
原因:在函数createString
中,局部变量s
原本应在栈上分配内存。但由于返回了其指针,函数调用结束后,若s
在栈上,其内存将被释放,指针会成为野指针。为避免这种情况,Go语言编译器会将s
分配到堆上,这样即使函数返回,内存依然有效。
- 传递大的结构体:
package main
type BigStruct struct {
data [10000]int
}
func processStruct(b BigStruct) {
// 处理逻辑
}
func main() {
var big BigStruct
processStruct(big)
}
原因:如果BigStruct
结构体非常大,将其作为参数传递到函数processStruct
时,在栈上分配这么大的空间可能会导致栈溢出风险。为了避免这种情况,Go语言编译器会选择将big
分配到堆上,以保证程序运行的稳定性。