9.2 Go 的逃逸分析
type Lang struct {
Name string
}
func copyLang(arg Lang) (result Lang) {
l := arg // 以 arg 的内容重新创建一个 Lang 实例,并将新实例赋值给 l
l.Name = "Golang" // 修改 l.Name 的属性不会改变 arg 中的内容
defer func() {
fmt.Printf("In copyLang: arg.Name: %s, l.Name: %s, result.Name: %s. Add: %p\n", arg.Name, l.Name, result.Name, &result)
}()
return l // 同理,此处复制一份 l 赋值给返回值 result
}
func main() {
l1 := Lang{"Java"}
fmt.Printf("In main before copyLang: l1.Name: %s\n", l1.Name)
// 1. 此处复制一份 l1, 然后作为参数传递给函数 copyLang, 即使函数修改了参数的内部属性,也不会影响 l1
// 2. 将函数 copyLang 的返回值变量 result 复制一份,赋值给 l3
l3 := copyLang(l1)
fmt.Printf("In main after copyLang: l1.Name: %s, l3.Name: %s\n", l1.Name, l3.Name)
}最后更新于