go 的逃逸规则和实例

我们其实都知道一个普遍的规则,就是如果变量需要使用堆空间,那么他就应该进行逃逸。但是实际上Golang并不仅仅把逃逸的规则如此泛泛。Golang会有很多场景具备出现逃逸的现象。

一般我们给一个引用类对象中的引用类成员进行赋值,可能出现逃逸现象。可以理解为访问一个引用对象实际上底层就是通过一个指针来间接的访问了,但如果再访问里面的引用成员就会有第二次间接访问,这样操作这部分对象的话,极大可能会出现逃逸的现象。

Go语言中的引用类型有func(函数类型),interface(接口类型),slice(切片类型),map(字典类型),channel(管道类型),*(指针类型)等。

那么我们下面的一些操作场景是产生逃逸的。

逃逸范例一

[]interface{}数据类型,通过[]赋值必定会出现逃逸

package main

func main() {
    data := []interface{}{6, 8}
    data[0] = 6
}

运行 : go tool compile -m ty_example1.go 
ty_example1.go:3:6: can inline main
ty_example1.go:4:23: []interface {} literal does not escape
ty_example1.go:4:24: 6 does not escape
ty_example1.go:4:27: 8 does not escape
ty_example1.go:5:10: 6 escapes to heap
 

逃逸范例二

map[string]interface{}类型尝试通过赋值,必定会出现逃逸。

package main

func main() {
    data := make(map[string]interface{})
    data["key"] = 200
}

我们通过编译看看逃逸结果:

go tool compile -m 2.go
2.go:3:6: can inline main
2.go:4:14: make(map[string]interface {}) does not escape
2.go:6:14: 200 escapes to heap

我们能看到,data["key"] = 200 发生了逃逸。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fish_study_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值