面试题答案
一键面试在Go语言编程中,以下常见情况会导致内存逃逸:
- 返回局部变量指针
- 原因:函数返回局部变量的指针,编译器无法确定该变量的生命周期,因此将其分配到堆上。
- 示例:
package main
func allocate() *int {
var num int
return &num
}
- 大的结构体作为参数传递
- 原因:如果结构体较大,为避免栈溢出,Go会将其分配到堆上。
- 示例:
package main
import "fmt"
type BigStruct struct {
data [10000]int
}
func process(s BigStruct) {
fmt.Println(s)
}
- interface类型的使用
- 原因:由于Go语言的动态类型系统,interface类型在编译期无法确定具体类型,可能导致内存逃逸。
- 示例:
package main
import "fmt"
type Animal interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string {
return "Woof"
}
func makeSound(a Animal) {
fmt.Println(a.Speak())
}
func main() {
dog := Dog{}
makeSound(dog)
}
- 闭包引用外部变量
- 原因:闭包会持有外部变量的引用,导致变量的生命周期延长,可能被分配到堆上。
- 示例:
package main
import "fmt"
func counter() func() int {
i := 0
return func() int {
i++
return i
}
}