type I interface {
F() int
}
type A struct{
x int
y int
}
func (a *A) F() int {
z := a.x + a.y
return z
}
func test(){
//&A不会发生逃逸现象 0.272 ns/op
//var a = &A{}
//a.F()
//&A不会发生逃逸现象 20.6 ns/op
a = &A{}
var i I = a
i.F()
}
func BenchmarkX(b *testing.B) {
b.ReportAllocs()
for i:=0; i<b.N; i++ {
test()
}
}
这里有的文章会说&A 是因为内联原因导致的,经过我的分析是因为逃逸现象的产生。从下面我可以清晰的发现当我们将&A 复制给interface 类型的时候发生了内存逃逸现象。
F:\gotest> go build -gcflags="-m -m" inline.go
inlining call to (*A).F method(*A) func() int { z := a.x + a.y; return z }
.\inline.go:10:7: a does not escape
.\inline.go:16:10: &A literal does not escape
<autogenerated>:1: parameter .this leaks to {heap} with derefs=0:
<autogenerated>:1: flow: {heap} = .this:
<autogenerated>:1: from .this.F() (call parameter) at <autogenerated>:1
<autogenerated>:1: leak