Sorry, poor explanation again.

When a variable is used from outside a closure's scope, it is *captured* by
the closure. Usually that means that the closure function is modified to
include a reference to that variable when it is called as a regular
function. An example from the compiler:
https://github.com/golang/go/blob/master/src/cmd/compile/internal/gc/closure.go#L311
.

In example2, this

// example2.go

package main

func main() {
 var y int
 func(x int) {
 y = x
 }(42)
}

is transformed into something like

// example2_modified.go

package main

func main() {
 var y int
 func(y *int, x int) {
 y = x
 }(&y, 42)
}

and then the same analysis from above is applied. y should not escape to
the heap here, similar to example3.go.

Hope that clarifies,
Chris

On Wed, Oct 5, 2016 at 6:18 AM, 刘桂祥 <liuguixiang...@gmail.com> wrote:

>   In go when closure call the out varible will pass  pointer to the
> closure func so I doubt in example2.go y is passed &y to closure
>
>   I don't know the compile how to analysis this and decide that can be
> allocated in stack correctly ?
>
> 在 2016年10月4日星期二 UTC+8下午11:54:02,Chris Manghane写道:
>>
>> In example1, the // BAD: y escapes is there because y should not escape
>> from that function, but the current algorithm needs to be improved for this
>> case. In that closure, the address of y is captured as the closure argument
>> p and since p is only dereferenced, the analysis should not consider it to
>> escape.
>>
>> In example3, the analysis above applies and y should not escape. y is
>> closed over and dereferenced, but we correctly do not mark it as escaping.
>>
>> In example2, y contains no pointers; it can never escape. The test was to
>> see if capturing/closing over a non-pointer value would cause it to escape.
>>
>> It's a bit confusing, but to restate, in example1, y should not escape
>> even though it currently does.
>>
>> On Mon, Oct 3, 2016 at 11:09 PM, 刘桂祥 <liuguix...@gmail.com> wrote:
>>
>>> // example1.go
>>>
>>> package main
>>>
>>>
>>> func main() {
>>>  var y int // BAD: y escapes
>>>  func(p *int, x int) {
>>>  *p = x
>>>  }(&y, 42)
>>> }
>>>
>>> example1.go  y escape to the heap
>>>
>>> // example2.go
>>>
>>> package main
>>>
>>> func main() {
>>>  var y int
>>>  func(x int) {
>>>  y = x
>>>  }(42)
>>> }
>>>
>>>   example2.go y is not escaped and why ??
>>>
>>> // example3.go
>>>
>>> package main
>>>
>>> func main() {
>>>  a := 100
>>>  y := &a
>>>  func(x int) {
>>>  *y = x
>>>  }(42)
>>> }
>>>
>>>  example3.go y is not escaped and why ??
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to golang-nuts...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to